2010-12-15 53 views
0

構造体(A)を持ち、メンバとして別の構造体(B)を取ります。 今私が代わりにB. のBとCの両方のメンバーとして構造Cをしたいが、私はメンバーの代わりに型キャスト を行う方法B.として構造体Cを割り当てることができますどのように構造体メンバの型キャスト

typedef struct 
{ 
int a; 
B b; 
}A 

typedef struct 
{ 
int a; 
}B 

typedef struct 
{ 
int a; 
}C 

同じタイプである

を助けてください
+0

実行時にstructメンバーデータをスワップする方法をお探しですか? –

+0

いいえ構造体Aに自分の構造体を渡したい場合や、型キャスティングでメンバーとしてCが必要な場合 – Sijith

+0

BとCが同じ型であるとすると、何かを継承するか、同じ種類のデータが含まれていると思いますか? – slycrel

答えて

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:構造体Aにvoid *が含まれているようにしてください(すべての型の安全性が失われます)。 (両方ともC/C++)

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

投稿にはC++のタグが付けられました。コメントいただきありがとうございます。私は私の投稿を明確にしました! –

1

CおよびC++は静的型付き言語です。あなたはそれをすることはできません。あなたがリンゴとして何かを宣言すれば、それは時代の終りまでリンゴのままです。

1

これらは同じタイプであるように見えますが(この単純なケースでは同じですが)、コンパイラによって異なるタイプとみなされます。型システムが純粋なCより複雑なC++やもっと複雑なケースには意味があります。

この種の割り当てを行うには、一般にコンパイラのトリックやハッカーに頼るべきではありません。代わりに、適切に行う。直接フィールドを割り当てたり、コードを簡素化するために、これらの線に沿ってヘルパー関数を作成します。

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

C++はまた、あなたが(代わりに、名前のヘルパー関数を作成する)あなたのために仕事をするために過負荷になる可能性があり代入演算子を持っています私はこれがあなたの現在の快適さのレベルを超えていると考えています。

関連する問題