![](/img/trans.png)
[英]type-casting abstract class type to struct type with a integer member
[英]Type casting a structure member
我有structure(A),它需要另一個structure(B)作為成員。 現在我希望結構C作為A的成員而不是B。B和C都是同一類型
typedef struct
{
int a;
B b;
}A
typedef struct
{
int a;
}B
typedef struct
{
int a;
}C
我如何將結構C分配為成員而不是B。如何進行類型轉換請幫助
C和C ++是靜態類型的語言。 你做不到 如果您將某物聲明為蘋果,它將一直作為蘋果,直到時代結束。
盡管它們看起來是相同的類型(並且在這種簡單情況下是相同的),但編譯器將它們視為不同的類型。 這對於更復雜的情況或類型系統比純C更復雜的C ++有意義。
通常,您不應該依賴編譯器技巧或黑客來進行此類分配。 相反,請正確執行。 直接分配字段,或者為簡化代碼,按照以下方式創建幫助函數:
void ASetBWithC(A *a, C c) {
assert(a != NULL);
a->b.a = c.a;
}
C ++還具有賦值運算符,您可以重載該賦值運算符為您完成工作(而不是創建命名的輔助函數),但是我懷疑這超出了您當前的舒適度。
不知道為什么要這樣做,很難推薦策略。 不過,這里有一些選擇。
選項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:使結構A包含一個void *(不建議這樣做,您將失去所有類型的安全性)。 (都是C / C ++)
struct A
{
int a;
void* foo; // you can now assign any pointer to foo :-S
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.