あなたは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関数が呼ばれている)?
あなたは構造体の内部で関数を定義しているので、C++クラスを使用しています。 Cコンパイラでコンパイルできるコードを生成するという目標はありますか? C++の機能を使用していない場合は、なぜこのC++にタグを付けましたか? –
この質問はCとC++かC++ですか?これは有効なCコードではありません。Cで構造体メンバ関数を使用することはできません(また、 'A'と' B'のtypedefを追加するか、または 'struct'タグをいくつかの場所のtypenamesの前に追加する必要があります) 。 –
C++では、構造体は基本的にクラスと同じであることがわかりました。 –