0

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

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

我想我的问题有两个。有没有办法将 STL 堆栈添加到联合中使用的类?如果没有,有没有办法在联合中使用的类中初始化指向 NULL 的指针?

类和联合看起来像这样:

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

union
{
    int nNum;
    MyClass myclass;
} u;

请注意:我无法更改工会。我承认我不能按照我的想法去做。不管听起来多么愚蠢,还有其他选择吗?我无法随心所欲地更改工会或重新设计应用程序。当您处理大约 18 年前首次编写的大型应用程序时,这就是问题所在。

4

2 回答 2

0

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

9.5 联合[class.union]

1
...
An object of a class with a non-trivial default constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor (12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects. If a union contains a static data member, or a member of reference type, the program is ill-formed.

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

但是,在 C++11 中,您可以为联合提供自己的构造函数,这应该实现正确的方法来复制具有非平凡构造函数的类。

9.5 联合[class.union]

2 A union can have member functions (including constructors and destructors), but not virtual (10.3) functions. A union shall not have base classes. A union shall not be used as a base class. If a union contains a non-static data member of reference type the program is ill-formed. At most one non-static data member of a union may have a brace-or-equal-initializer. [Note: If any non-static data member of a union has a non-trivial default constructor (12.1), copy constructor (12.8), move constructor (12.8), copy assignment operator (12.8), move assignment operator (12.8), or destructor (12.4), the corresponding member function of the union must be user-provided or it will be implicitly deleted (8.4.3) for the union. — end note ]
您可能还对以下文章感兴趣
http://cpp11standard.blogspot.com/2012/11/c11-standard-explained-1-unrestricted.html

于 2013-07-08T09:34:55.050 回答
0

您可以将联合定义为

union
{
    int nNum;
    MyClass * myclass;
} u;

这具有额外的好处,即 int 和 pointer 的大小相同并且可以编译。

此外,您的示例不会编译。它缺少';' 在课程结束时。

于 2013-07-08T09:28:37.457 回答