错误:访问不完整类型的成员:前向声明

69

我在同一个.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文件上编写代码。

我不能先写类B再写类A。

你有任何解决我的问题的想法吗?


4
A::doSomething函数体移动到B类的定义之后。 - dyp
2
我在线程中谈论了这个问题:“在类A之前无法写出类B”。我使用一个示例代码来解释我的问题。在我的实际代码中,我在类A中使用了指向类B的指针。因此,如果我在类A之前写类B,问题仍然存在! - LOLKFC
应避免使用以下划线开头的名称,例如 _b。它们可能会被编译器/标准库在全局命名空间中使用;此外,您绝对不应该使用以下划线开头并后跟大写字母的标识符,例如 _B(也是保留的)。 - dyp
2个回答

53

doSomething 的定义移出类声明,并放在 B 后面,同时通过将其设为 public 或使用 friend 来使 A 能够访问 add

class B;

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

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

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

47
有类似的问题。我忘记在.cpp文件中包含另一个类的头文件。 - Volte
5
如果A是一个模板类怎么办?那么你就不能仅仅将它移动到类声明之外... - John Doe
@Volte,正是我的情况!谢谢! - Yeheshuah

16
在使用类之前,你必须有类B的定义。否则,编译器怎么知道存在一个函数B::add呢?
要么在类A之前定义类B,要么将A::doSomething的内容移到类B定义之后。
class B;

class A
{
    B* b;

    void doSomething();
};

class B
{
    A* a;

    void add() {}
};

void A::doSomething()
{
    b->add();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接