我有結構(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.如何做類型轉換 請幫助
我有結構(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.如何做類型轉換 請幫助
不知道你爲什麼要這樣做,很難推薦一個策略。這裏有幾個選項。
選項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
};
該帖子被標記爲C++。感謝評論,我澄清了我的文章! – 2010-12-15 17:13:06
C和C++是靜態類型語言。你做不到。如果你將某些東西聲明爲蘋果,那麼它將一直保持爲蘋果,直到時代的終結。
儘管它們看起來是相同的類型(並且在這種簡單情況下是相同的),但它們被編譯器視爲不同的類型。這對於更復雜的情況或C++中的類型系統比純C更復雜。
您通常不應該依靠編譯器技巧或hackery來執行此類分配。相反,正確地做。無論是直接分配領域,或者簡化代碼,創建沿着這些線路的輔助功能:
void ASetBWithC(A *a, C c) {
assert(a != NULL);
a->b.a = c.a;
}
C++也有賦值運算符,你可以重載做你的工作,你(而不是創建一個名爲輔助函數)但我懷疑這超出了你目前的舒適程度。
您是否正在尋找一種方法在運行時交換結構成員數據? – 2010-12-15 16:32:41
不,我想通過我自己的結構結構A或需要C作爲成員通過類型轉換 – Sijith 2010-12-15 16:35:08
當你說B和C是相同的類型,你的意思是他們繼承的東西或他們包含相同類型的數據? – slycrel 2010-12-15 16:36:00