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:judgement_day,dateMask,timeMask : cannot initialize static class data via constructor

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

其他人已经回答了关于工会的问题;它不能包含具有非平凡默认构造函数的成员。要回答第二个问题,关于成员初始化:

不能在类定义中初始化非静态成员;它们必须在构造函数的初始化列表中初始化:

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

联合不能包含类实例。考虑一个包含两个对象的联合,在创建联合时应该调用哪个构造函数?编译器不能同时调用这两个构造函数,因为这可能会导致一个对象包含错误值。

于 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 回答