1

クラスとその構造体の共用体にネストされた構造体があります。引数を取る構造体コンストラクターがある場合、共用体はコンパイルされません。

また、引数を使用して構造体のインスタンスを作成したいと考えています。その行も失敗します。

class test
{
public:
test(void);
~test(void);

struct dtType {
    // inline constructors with initialisation lists
    dtType() : mins(0), hrs(0),day(0),mnth(0),year(0),DPOffset(0),DTType(0) {}
    dtType(byte z) : mins(z), hrs(z),day(z),mnth(z),year(z),DPOffset(0),DTType(0) {}
    dtType(byte n,byte h, byte d, byte m, byte y, byte o, byte t) : mins(n), hrs(h),day(d),mnth(m),year(y),DPOffset(o),DTType(t) {}

    // overloaded operator functions
    bool operator< (dtType date){return true;};
    bool operator<= (dtType date){return true;};
    bool operator> (dtType date){return true;};
    bool operator>= (dtType date){return true;};
    bool operator== (dtType date){return true;};

    // data members
    unsigned mins: 3;
    unsigned hrs: 5; // 8 bits
    unsigned day: 5; 
    unsigned mnth: 4;
    unsigned year: 7; // 16 bits
    unsigned DPOffset: 6; 
    unsigned DTType  : 2;
};

// if I comment out the union it compiles, otherwise I get:
// error C2620: member 'test::dtUnion::dt' of union 'test::dtUnion' has user-defined  constructor or non-trivial default constructor

union dtUnion { 
    dtType dt;
    unsigned long dtLong; // 32 bits
} dtU;

// if I call dtType judgement_day(); it compiles. Otherwise I get:
dtType judgement_day(1); // error C2059: syntax error : 'constant'

};

以下の回答に従って、次のことを試しましたが、エラー C2438 が表示されます。

class test
{
public:
    test(): judgement_day(1),dateMask(1,1,1,1,1,0,0),timeMask(1,1,0,0,0,0,0){}
~test();
public:
struct dtType {
    // inline constructors with initialisation lists
    dtType() : mins(0), hrs(0),day(0),mnth(0),year(0),DPOffset(0),DTType(0) {}
    dtType(byte z) : mins(z), hrs(z),day(z),mnth(z),year(z),DPOffset(0),DTType(0) {}
    dtType(byte n,byte h, byte d, byte m, byte y, byte o, byte t) : mins(n), hrs(h),day(d),mnth(m),year(y),DPOffset(o),DTType(t) {}
    // overloaded operator functions
    bool operator< (dtType date){return true;};
    bool operator<= (dtType date){return true;};
    bool operator> (dtType date){return true;};
    bool operator>= (dtType date){return true;};
    bool operator== (dtType date){return true;};
    // data members
    unsigned mins: 3;
    unsigned hrs: 5; // 8 bits
    unsigned day: 5; 
    unsigned mnth: 4;
    unsigned year: 7; // 16 bits
    unsigned DPOffset: 6; 
    unsigned DTType  : 2;
};
const static dtType judgement_day;
const static dtType dateMask;
const static dtType timeMask;
};
4

4 に答える 4

3

明示的なコンストラクターを持つunionメンバーを持つことは標準では許可されていませんunion。メンバーまたはネストされた型であることとは何の関係もありません。

以下もコンパイルに失敗します:

struct X
{
    X() {};
};
union Y
{
    X k;
};
于 2012-07-17T09:55:23.663 に答える
1

組合についての質問に答えた人もいます。重要なデフォルト コンストラクターを持つメンバーを含めることはできません。メンバーの初期化に関する 2 番目の質問に答えるには、次のようにします。

クラス定義で非静的メンバーを初期化することはできません。コンストラクターの初期化子リストで初期化する必要があります。

class test {
    // stuff
    dtType judgement_day;
};

test::test() : judgement_day(1) {}

コンパイルされる理由dtType judgement_day();は、変数ではなく関数を宣言しているためです。

更新: 実際にはこれらのメンバーを静的にしたいので、グローバル変数と同様に、代わりにソース ファイルで初期化されます。

// in the header
class test {
    // stuff
    const static dtType judgement_day;
};

// in exactly one source file
const test::dtType dtType::judgement_day(1);
于 2012-07-17T10:21:41.640 に答える
0

ユニオンにクラスインスタンスを含めることはできません。2つのオブジェクトを含むユニオンを検討します。そのユニオンを作成するときに、どのコンストラクターを呼び出す必要がありますか?1つのオブジェクトに誤った値が含まれる可能性があるため、コンパイラーは両方のコンストラクターを呼び出すことはできません。

于 2012-07-17T09:56:12.833 に答える
0

dtType共用体にメンバーが含まれている限り、dtTypeコンストラクターを持つことはできません。

ただしvoid Set()、コンストラクターを代わりに関数に変更して、構築後に暗黙的に呼び出すことができます。

例えば:

int main()
{
    test::dtType judgement_day;
    judgement_day.Set(1);

    test::dtUnion x;
    x.dt.Set(1);

    assert(judgement_day == x.dt);
    return 0;
}
于 2012-07-17T10:11:56.580 に答える