C++访问类引用信息时出现“不允许不完整类型”错误(前向声明中存在循环依赖)

66

最近我的代码出现了一些问题,涉及到循环依赖。简而言之,有两个类,Player和Ball,它们都需要使用对方的信息。在代码的某个时刻,它们都将被传递对方的引用(从另一个包含两个.h文件的类中传递)。

阅读了相关资料后,我从每个文件中移除了#include.h文件,并采用了前向声明。这解决了彼此声明类的问题,但是现在在尝试访问传递的对象引用时出现了“不完整类型错误”。似乎有一些类似的例子,但通常与更复杂的代码混合在一起,很难缩小到基础部分。

我已经将代码重写为其最简形式(本质上是一个骨架)。

Ball.h:

class Player;

class Ball {
public:
    Player& PlayerB;
    float ballPosX = 800;
private:

};

Player.h:

class Ball;

class Player {
public:
    void doSomething(Ball& ball);
private:
};

Player.cpp:

#include "Player.h"

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}
任何帮助理解为什么会这样的帮助都将不胜感激 :)

任何帮助理解为什么会这样的帮助都将不胜感激 :)


7
在Player.cpp中,#include "Ball.h" - Igor Tandetnik
4个回答

37

如果您按照这个顺序放置您的定义,那么代码将被编译

class Ball;

class Player {
public:
    void doSomething(Ball& ball);
private:
};

class Ball {
public:
    Player& PlayerB;
    float ballPosX = 800;
private:

};

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}

int main()
{
}

函数doSomething的定义需要类Ball的完整定义,因为它访问其数据成员。

在您的代码示例中,模块Player.cpp无法访问类Ball的定义,因此编译器会发出错误。


28

Player.cpp需要引用Ball类的定义。因此,只需添加#include "Ball.h"即可。

Player.cpp:

#include "Player.h"
#include "Ball.h"

void Player::doSomething(Ball& ball) {
    ball.ballPosX += 10;                   // incomplete type error occurs here.
}

3

以下是我的代码和导致“不完整类型错误”的原因:

#include "X.h" // another already declared class
class Big {...} // full declaration of class A

class Small : Big {
    Small() {}
    Small(X); // line 6
}
//.... all other stuff

在文件"Big.cpp"中,我声明了A2的构造函数,并带有X作为参数。

Big.cpp

Small::Big(X my_x) { // line 9 <--- LOOK at this !
}

我把"Small::Small"写成了"Small::Big",真是个愚蠢的错误。在类X中,我一直收到“不完整类型现在允许”的错误提示(第6行和第9行),这让我非常困惑。无论如何,这就是错误发生的地方,主要原因是我写代码时很累,需要花费2个小时来探索和重写代码才能找出错误。

1
在我的情况下,是因为打错了一个字母。
我有类似这样的东西:
struct SomethingStrcut { /* stuff */ };

typedef struct SomethingStruct smth;

注意结构体的名称与类型定义不同。

我将 struct 拼错成了 strcut

检查你的代码,看看是否有拼写错误。


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