嵌入式结构和正确的函数调用

时间:2011-01-30 02:05:47

标签: c++ c struct

你有两个结构。一种是'A',另一种是'B'。 类型'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; 
}

您希望能够调用struct B的'print_stuff'函数,即使使用以下代码:

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

不允许使用继承,C ++容器或类。结构B必须有a_part。

如何编写代码,以便无论指针的类型如何,都会调用正确的print_stuff函数(在这种情况下,如果指向类型B的结构的指针被转换为A *,您如何保证B中的print_stuff函数被称为?

2 个答案:

答案 0 :(得分:3)

你可以使print_stuff成为一个函数指针,但是你需要手动将它连接到正确的函数。但在这种情况下,您只是复制C ++继承机制,因此它毫无意义。

A对象无法自动知道它所包含的位置,或者它是否包含它。

所以底线是,只使用C ++继承。

答案 1 :(得分: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;
}