2010-06-25 82 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子對象。