0

私の意見では、設計がかなり不十分なアプリケーションに取り組んでいますが、それは別の問題です。そのアプリには、変数を追加する必要がある単純なクラスがあります。この場合、STL スタックをクラスに追加したいと思います。他の場所で同じクラスがユニオン内で使用され、コンパイラーがクラスにコピーコンストラクターがあると不平を言うことを除いて、単純にする必要があります。追加した変数を削除すると、正常にコンパイルされます。私の最初の考えは、スタックをポインターとして追加し、コンストラクターで初期化することでしたが、コンパイラーは、クラスに自明でないコンストラクターがあると不平を言います。

私の2番目の(理想的ではない)考えは、それをポインタとして追加し、クラスの外で初期化することでした。これが良い解決策ではないことはわかっていますが、ここで書き直すことができない、設計が不十分なコードに直面しています。ただし、初期化する必要がある場所で、既に初期化されているかどうかがわからないため、これは機能しません。クラス内のポインターを 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

ユニオンを次のように定義できます

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

これには、int とポインターが同じサイズであり、コンパイルできるという追加の利点があります。

また、あなたの例はコンパイルされません。「;」がありません クラスの終わりに。

于 2013-07-08T09:28:37.457 に答える
0

どちらの質問に対する答えも、C++03 では NO です。以来

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 に答える