2010-06-25 92 views
1

我有三个结构,其中一个与其他两个继承:C++:从基类实例构造子类?

typedef struct _abc 
{ 
    int A; 
    int B; 
    int C; 
} ABC; 

typedef struct _def 
{ 
    int D; 
    int E; 
    int F; 
} DEF; 

typedef struct _abcdef : ABC, DEF { } ABCDEF; 

(我想要的第三结构包含前两者的所有成员是否有更好的方式来做到这一点?)

现在,我的ABCDEF完全填充的情况下,我想作一个新的ABCDEF实例:

int main() 
{ 
    ABC abc; 
    abc.B = 2; 
    abc.C = 1; 
    abc.A = 10; 

    DEF def; 
    def.D = 32; 
    def.E = 31; 
    def.F = 90; 

    // make a new ABCDEF with all the values of abc and def 
} 

什么是创造的最佳方式?我能做到这一点,但它还挺吸收:

ABCDEF abcdef; 
abcdef.A = abc.A; 
abcdef.B = abc.B; 
abcdef.C = abc.C; 
abcdef.D = def.D; 
abcdef.E = def.E; 
abcdef.F = def.F; 

以上耦合到结构的成员,如果添加了许多成员是凌乱。

回答

8

这是C++。那些typedef是不需要的。你必须构造函数:

struct abc { 
    int A; 
    int B; 
    int C; 
    abc(int a, int b, int c) : A(a), B(b), C(c) {} 
}; 

struct def { 
    int D; 
    int E; 
    int F; 
    def(int d, int e, int f) : D(d), E(e), F(f) {} 
}; 

struct abcdef : abc, def { 
    abcdef(const abc& a, const def& d) : abc(a), def(d) {} 
}; 

int main() 
{ 
    abc a(2,1,10); 
    def d(32,31,90); 
    abcdef ad(a,d); 

    return 0; 
} 
4

我想要的第三结构包含前两者的所有成员。有没有更好的方法来做到这一点?

让你的第三个结构包含另外两个的实例是否可行? (这也可能是更合乎逻辑的,如果这是一个“有”的关系,而不是“是一个”。)

struct ABCDEF 
{ 
    ABC abc; 
    DEF def; 
}; 

当然,这种改变正是你如何访问和使用这些成员。但是,如果这对您是可能的,那么它会打开几个简单的方法来初始化ABCDEF。

ABC abc = { 10, 2, 1 }; 
DEF def = { 32, 31, 90 }; 

// Assign members from preexisting variables. 
ABCDEF abcdef1; 
abcdef1.abc = abc; 
abcdef1.def = def; 

// Initialize aggregate using preexisting variables. 
ABCDEF abcdef2 = { abc, def }; 

// Initialize the entire aggregate in one statement. 
ABCDEF abcdef3 = { 10, 2, 1, 32, 31, 90 }; 

否则,如果你确实需要有ABCDEF从其他两个继承,那么我会一般由SBI的答复建议的概念,你会添加相应的构造函数。尽管取决于你确切的需求,但也可以使用聚合初始化和生成的拷贝构造函数来简化它。

struct ABC 
{ 
    int A; 
    int B; 
    int C; 
}; 

struct DEF 
{ 
    int D; 
    int E; 
    int F; 
}; 

struct ABCDEF : public ABC, public DEF 
{ 
    ABCDEF(const ABC& abc, const DEF& def) : ABC(abc), DEF(def) {} 
}; 

int main() 
{ 
    ABC abc = { 10, 2, 1 }; 
    DEF def = { 32, 31, 90 }; 
    ABCDEF abcdef(abc, def); 

    return 0; 
} 
0

如果您打算使用C++,那么您应该使用C++构造,包括构造函数等。如果你想要使用C语言,只需使用C构造(组合而不是继承,顺便提一下,这是一个很好的建议:总是比较喜欢使用组合来继承)。

然后,有一个丑陋的伎俩(不推荐,但feasable)通过使用强制转换到使用编译器生成赋值运算符:

ABC abc = { 1, 2, 3 }; 
DEF def = { 4, 5, 6 }; 
ABCDEF o = {}; 
static_cast<ABC&>(o) = abc; 
static_cast<DEF&>(o) = def; 

这是一个真的,真的,真的丑回答。刚刚写了它指出什么static_cast -ing派生对象到基类的意思是:它生成一个引用基类的子对象部分的类型基准的引用,包括当多重继承进入时需要的偏移量。请注意,如果reinterpret_cast已被替换,则这两个分配都将覆盖ABCDEF实例的ABC子对象。