2011-01-30 15 views
2

あなたは2つの構造体が与えられています。タイプ 'A'の1つ、タイプ 'B'の1つ。 タイプ 'B'のタイプには 'A'タイプの構造体があります。したがって、このような何か:組み込み構造体と正しい関数呼び出し

struct A { 
    void print_stuff(A * a){ puts("From A"); } 
}; 

struct B { 
    A a_part; 
    char * s; 
    void print_stuff(B * b){ 
      printf("From B\n\t%s\n", b->s); 
    } 
}; 

B * B_new(char * str) { 
    B * b = (B*)malloc(sizeof(struct B)); 
    b->s = strdup(str); 
    return b; 
} 

あなたもこのようなコードで、構造体Bの「print_stuff」関数を呼び出すことができるようにしたい:

A * aptr = (A*) B_new("foo"); 
aptr->print_stuff(aptr); 

あなたは継承を使用することを許可されていない、C++のコンテナまたはクラス。構造体Bはa_partを持たなければならない。

ポインタの型に関係なく、正しいprint_stuff関数が呼び出されるようにコードを記述します(この場合、B型の構造体へのポインタがA *にキャストされた場合、 Bのprint_stuff関数が呼ばれている)?

+3

あなたは構造体の内部で関数を定義しているので、C++クラスを使用しています。 Cコンパイラでコンパイルできるコードを生成するという目標はありますか? C++の機能を使用していない場合は、なぜこのC++にタグを付けましたか? –

+4

この質問はCとC++かC++ですか?これは有効なCコードではありません。Cで構造体メンバ関数を使用することはできません(また、 'A'と' B'のtypedefを追加するか、または 'struct'タグをいくつかの場所のtypenamesの前に追加する必要があります) 。 –

+2

C++では、構造体は基本的にクラスと同じであることがわかりました。 –

答えて

3

print_stuffを関数ポインタにすることはできますが、手動で正しい関数に接続する必要があります。しかしこの場合、C++の継承メカニズムを複製するだけなので無意味です。

Aオブジェクトには、そのオブジェクトが含まれているかどうか、まったく含まれているかどうかは自動的に判断されません。

結論としては、C++の継承を使用するだけです。

+0

これは私の教授が望んだものです。このプロジェクトのポイントは、C++のみの機能とg ++を使用したいくつかの機能をエミュレートすることでした。ありがとう! –

0

これは本当に恐ろしいことです。しかし、はい、それを行う方法があります。 boolフィールドをAに置き、同じ場所にBと入力して、実際のタイプを示します。以下のコードは、C++に感謝します(他の目的には使用しないでください)。

struct A { 
    bool isB; 
    A() 
    { 
    isB=false; 
    } 
    void print_stuff(A * a); 
}; 

struct B { 
    bool trueB; 
    A a_part; 
    char * s; 

    B() 
    { 
    isB=true; 
    } 

    void print_stuff(B * b){ 
    printf("From B\n\t%s\n", b->s); 
    } 
}; 

void A::print_stuff(A * a) 
    { 

    if(isB) 
     { 
     B* b = (B*)(this); 
     b->print_stuff(b); 
     } 
    else 
     puts("From A"); 
    } 

B * B_new(char * str) { 
    B * b = (B*)malloc(sizeof(struct B)); 
    b->s = strdup(str); 
    b->trueB=true; 
    return b; 
} 
+0

フィールドが 'A'にある場合、それは既に' B'にあります。 –

+0

@Chris Lutz: 'a_part'の一環として、そうですが、これはこのように明確です。 – Beta

+0

'a_part'はもはや' B'の最初のメンバーではないので、これは明確ではなく、キャストを駄目にします。 –

関連する問題