簡體   English   中英

壓鑄結構件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM