2010-12-15 166 views
0

我有結構(A),它採用另一種結構(B)作爲構件。 現在我想組織C作爲的,而不是B. 成員B和C是同一類型的鑄造結構構件的類型

typedef struct 
{ 
int a; 
B b; 
}A 

typedef struct 
{ 
int a; 
}B 

typedef struct 
{ 
int a; 
}C 

我如何分配結構C作爲成員,而不是B.如何做類型轉換 請幫助

+0

您是否正在尋找一種方法在運行時交換結構成員數據? – 2010-12-15 16:32:41

+0

不,我想通過我自己的結構結構A或需要C作爲成員通過類型轉換 – Sijith 2010-12-15 16:35:08

+0

當你說B和C是相同的類型,你的意思是他們繼承的東西或他們包含相同類型的數據? – slycrel 2010-12-15 16:36:00

回答

1

不知道你爲什麼要這樣做,很難推薦一個策略。這裏有幾個選項。

選項1:使用模板。 (僅限C++)

template <type T> 
struct A 
{ 
    int a; 
    T* t; 
}; 

struct Foo 
{ 
    int a; 
}; 

struct B : public Foo 
{ 
}; 

struct C : public Foo 
{ 
}; 

struct A<Foo> A_foo; 

struct B; 
struct C; 

A_foo.t = &B; //OK! This can now take pointer to any class that extends Foo. 
A_foo.t = &C; //OK! 

選項2:使struct A包含一個void *(不推薦,您將失去所有類型的安全性)。 (C/C++)

struct A 
{ 
    int a; 
    void* foo; // you can now assign any pointer to foo :-S 
}; 
+0

該帖子被標記爲C++。感謝評論,我澄清了我的文章! – 2010-12-15 17:13:06

1

C和C++是靜態類型語言。你做不到。如果你將某些東西聲明爲蘋果,那麼它將一直保持爲蘋果,直到時代的終結。

1

儘管它們看起來是相同的類型(並且在這種簡單情況下是相同的),但它們被編譯器視爲不同的類型。這對於更復雜的情況或C++中的類型系統比純C更復雜。

您通常不應該依靠編譯器技巧或hackery來執行此類分配。相反,正確地做。無論是直接分配領域,或者簡化代碼,創建沿着這些線路的輔助功能:

void ASetBWithC(A *a, C c) { 
    assert(a != NULL); 
    a->b.a = c.a; 
} 

C++也有賦值運算符,你可以重載做你的工作,你(而不是創建一個名爲輔助函數)但我懷疑這超出了你目前的舒適程度。