C++联合字段未正确设置

C++ Union fields not set correcly

本文关键字:设置 字段 C++      更新时间:2023-10-16

我有一个模板化的联合类型NodeType。问题是,在分配其变量字段时没有正确设置,并且在随后访问时包含垃圾值。具体地说,问题出现在_field1和_field2上——请参阅main。

#include <cstdlib>
#include <iostream>
using namespace std;

        template <class T>
        struct structExampleType                
        {
          T _structField;
          typedef structExampleType<T>* pointerStructExample;
        };

         enum TYPE_tag
         {FIELD1_tag, FIELD2_tag} TYPE_tag; 
          template <class T>//, class P>
          union NodeType
          {
           enum TYPE_tag _nodeType_tag;
           char _field1;
           typename structExampleType<T>::pointerStructExample _field2;
           NodeType(){_field2=0;}
           NodeType(enum TYPE_tag nodeType_tag, char _charField)
           {
            _nodeType_tag=nodeType_tag;
            _field1=_charField;
            //_field2=0;
           }  
           NodeType(enum TYPE_tag nodeType_tag, typename structExampleType<T>::pointerStructExample pointer)
           {
            _nodeType_tag=nodeType_tag;
            _field2=pointer;
            //_field1='-';
           }          
          };



int main(int argc, char *argv[])
{
    NodeType<int> node1, node2;
    structExampleType<int>* structExamplePointer;
    structExamplePointer=new structExampleType<int>();
    structExamplePointer->_structField=100;
//    structExamplePointer->_field2=structExamplePointer;
    node1=NodeType<int>(FIELD1_tag,'-');
    node2=NodeType<int>(FIELD2_tag,structExamplePointer);    

    cout<<endl<<"node1: ";    
    if (node1._nodeType_tag==FIELD1_tag)
    {cout<<node1._field1<<endl;}
    else
    {cout<<node1._field2<<endl;}        

    cout<<endl<<"node2: ";
    if (node2._nodeType_tag==FIELD2_tag)
    {cout<<node2._field1<<endl;}
    else
    {
        cout<<node2._field2<<endl;
        cout<<(node2._field2)->_structField<<endl;
    }  

    system("PAUSE");
    return EXIT_SUCCESS;
}

问题出在哪里?提前感谢您抽出时间。

main中有以下两行:

structExampleType<int>* structExamplePointer;
structExamplePointer->_structField=100;

请记住,除非局部变量有默认的构造函数(指针没有),否则它们不会被初始化,因此在第二秒内,您将取消引用未初始化的指针structExamplePointer,从而导致未定义的行为。

您似乎也误解了union的用途,因为您试图设置多个字段。在union中,所有字段共享相同的空间,因此当写入一个成员时,所有成员都会发生更改。只有最后一次写入成员的内容才有效。尝试使用其他字段可能会再次导致未定义的行为。


如果您需要一个"标签"字段其他数据,则您可以选择包含标签和并集数据的结构:

struct NodeType
{
    enum TAG_Type
    {
        FIELD1,
        FIELD2
    } type;
    union
    {
        char field1;
        struct some_struct* field2;
    }
};

对于union,成员试图在内存中占据相同的空间,因此您的构造函数通过分配给每个成员并覆盖彼此来造成问题。

该联盟的规模只有容纳其最大数据成员所需的规模。其他数据成员被分配在与最大成员相同的字节中。

这里实际上不是field1和field2的并集,而是{tag,field1,field2}的并集。这就是你看到垃圾的原因。并集仍然是一个单独的内存区域,但您在构建逻辑中将其设置了三次。

您可以从更简单的案例开始,阅读一些文档,例如。,http://msdn.microsoft.com/en-us/library/5dxy4b7b.aspx

为了实现你的目标,你可能会做这样的事情(你需要你的标签在工会之外):

union MyUnionType{int data_int;double data_double;}

typedef枚举{IntTag,DoubleTag}UnionTypeTag;

类MyVariableClass{私人:MyUnionType m_variableField;UnionTypeTag m_variableFieldType;}

另一种方法是设计代码,以便在代码路径的任何一点上都知道要处理的联合类型的"风格"。

我个人的观点是,后者(总是知道你的联盟"味道"是什么)是在K&当他们想到联合概念时。

在使用指针structExampleType<int>* structExamplePointer之前,请您草签一下。

由于取消引用未初始化的指针是导致问题的原因