C++ 在C+中初始化变量+;工会中使用的阶级?

C++ 在C+中初始化变量+;工会中使用的阶级?,c++,class,stl,unions,C++,Class,Stl,Unions,我正在开发一个应用程序,在我看来,它的设计相当糟糕,但这是另一个问题。在那个应用程序中有一个简单的类,我需要添加一个变量。在这种情况下,我想向类中添加一个STL堆栈。应该很简单,但在其他地方,在联合中使用相同的类,然后编译器会抱怨该类有一个复制构造函数。如果我删除添加的变量,它会编译得很好。我的第一个想法是将堆栈添加为指针,然后在构造函数中初始化它,但是编译器抱怨该类有一个非平凡的构造函数 我的第二个想法是将它添加为指针,并在类之外初始化它。我知道这不是一个好的解决方案,但我遇到了一些设计糟糕的

我正在开发一个应用程序,在我看来,它的设计相当糟糕,但这是另一个问题。在那个应用程序中有一个简单的类,我需要添加一个变量。在这种情况下,我想向类中添加一个STL堆栈。应该很简单,但在其他地方,在联合中使用相同的类,然后编译器会抱怨该类有一个复制构造函数。如果我删除添加的变量,它会编译得很好。我的第一个想法是将堆栈添加为指针,然后在构造函数中初始化它,但是编译器抱怨该类有一个非平凡的构造函数

我的第二个想法是将它添加为指针,并在类之外初始化它。我知道这不是一个好的解决方案,但我遇到了一些设计糟糕的代码,我无法重写。然而,这将不起作用,因为我需要在哪里初始化它,我不知道它是否已经初始化。我不能将类中的指针初始化为NULL,因为即使这样做,编译器也会抱怨类现在有一个非平凡的构造函数

我想我的问题是双重的。有没有办法将STL堆栈添加到联合中使用的类中?如果没有,是否有一种在联合中使用的类中初始化指向NULL的指针的方法

类和联合看起来像这样:

class MyClass
{
    public:
        std::stack<short> Index; // ideally what I wanted
}

union
{
    int nNum;
    MyClass myclass;
} u;
class-MyClass
{
公众:
std::stack Index;//理想情况下是我想要的
}
联盟
{
内nNum;
MyClass MyClass;
}u;

请注意:我不能改变工会。我承认我不能做我所想的。不管听起来有多傻,还有其他选择吗。我不能改变联盟或重新设计应用程序,因为我想这么多。当你在大约18年前首次编写大型应用程序时,这就是问题所在。

你可以将union定义为

union
{
    int nNum;
    MyClass * myclass;
} u;
这还有一个额外的好处,即int和pointer大小相同,并且可以编译


而且,您的示例无法编译。它不见了在课程结束时。

对于C++03,这两个问题的答案都是否定的。 自

9.5工会[类别工会]
1

具有非平凡默认构造函数(12.1)、非平凡复制构造函数(12.8)、非平凡析构函数(12.4)或非平凡复制赋值运算符(13.5.3、12.8)的类的对象不能是联合的成员,也不能是 可以创建这样的对象数组。如果联合包含静态数据成员或引用类型的成员, 程序格式不正确。

您仍然可以将构造函数添加到将初始化指针而不是类构造函数的联合中

然而,在C++11中,您可以为union提供自己的构造函数,这应该实现用非平凡构造函数复制类的正确方法

9.5工会[类别工会]
2联合可以有成员函数(包括构造函数和析构函数),但不能有虚函数(10.3)。并集不应具有基类。活接头不得用作基类。如果联合包含引用类型的非静态数据成员,则程序格式错误。一个联合的最多一个非静态数据成员可以有一个大括号或相等的初始值设定项。[注意:如果联合体的任何非静态数据成员具有非平凡的默认构造函数(12.1)、复制构造函数(12.8)、移动构造函数(12.8)、复制赋值运算符(12.8)、移动赋值运算符(12.8)或析构函数(12.4),则联合体的相应成员函数必须
用户提供,否则将为工会隐式删除(8.4.3)。-结束注释]

您可能还对以下文章感兴趣

不要使用活接头。只是我的建议。正如我已经说过的,我不能更改代码。它不是我的,在那里已经很久了。我不能改变它。很遗憾你不能重写它。尽管如此,我还是坚持我的建议,因为我认为这是正确的。你不能做某事并不意味着那不是正确的事情。我不能改变工会。这段代码不是为了编译,它只是为了参考,所以我说“类似于”。不过谢谢。啊,不完全清楚你的意思是“我不能改变那个联盟的任何东西”,还是你不能停止使用联盟