59

我在同一个 .cpp 文件中有两个类:

// forward
class B;

class A {       
   void doSomething(B * b) {
      b->add();
   }
};

class B {
   void add() {
      ...
   }
};

转发不起作用,我无法编译。

我收到此错误:

error: member access into incomplete type 'B'
note: forward declaration of 'B'

我正在使用 clang 编译器(clang-500.2.79)。

我不想使用多个文件(.cpp 和 .hh),我只想在一个 .cpp 上编写代码。

我不能在 A 类之前写 B 类。

你知道如何解决我的问题吗?

4

2 回答 2

45

doSomething定义移到其类声明之外和之后B,也add可以A通过public-ing 或friend-ing 来访问它。

class B;

class A
{
    void doSomething(B * b);
};

class B
{
public:
    void add() {}
};

void A::doSomething(B * b)
{
    b->add();
}
于 2013-11-13T19:44:50.930 回答
14

在使用类之前,您必须具有类的定义。B否则编译器怎么会知道存在这样的函数B::add

B在 class之前定义 class A,或者将主体移动A::doSomething到 class 之后B定义,例如

class B;

class A
{
    B* b;

    void doSomething();
};

class B
{
    A* a;

    void add() {}
};

void A::doSomething()
{
    b->add();
}
于 2013-11-13T19:41:23.433 回答