我不明白为什么在这个特定的例子中会得到一个未解析的外部符号。
我在头文件中定义了一个矩形结构。
我有一个Level类,当Level创建一个新玩家时,它有一个指向Player类的指针。
在我的Player类中,构造函数接收一个指向其当前级别的指针。
因此,由于我的Level包括Player.h
,我在Player类中正向声明Level以防止循环引用。
然而,当我尝试将Rectangle成员变量添加到我的Player类中时,我得到了未解决的外部符号错误,但我看不出原因,因为Player类包括标头,并且定义在标头中。它在我的Level课堂上运行良好。
此外,如果我将成员变量更改为指针,它的链接会很好。
有人能向我解释为什么会出现这种情况,以及我如何解决这个问题吗?
// Rectangle.h
#pragma once
namespace Test
{
struct Rectangle
{
public:
Rectangle();
Rectangle(
int x,
int y,
int width,
int height) :
X(x),
Y(y),
Width(width),
Height(height)
{
}
int X;
int Y;
int Width;
int Height;
};
}
// Level.h
#pragma once
#include "Player.h"
#include <memory>
namespace Test
{
class Level
{
public:
Level()
{
_player.reset(new Player(this));
};
private:
std::unique_ptr<Player> _player;
};
}
// Player.h
#pragma once
#include "Rectangle.h"
namespace Test
{
class Level;
class Player
{
public:
Player(
Level* currentLevel) :
_currentLevel(currentLevel)
{
}
private:
Level* _currentLevel;
// This line causes the issue
Rectangle _localBounds;
};
}
您忘记在Rectangle构造函数上添加大括号。这样做:
Rectangle() {}
所以问题是你有定义,但没有实现。您确实可以声明一个不带大括号的函数,但这就像您向编译器承诺要在其他地方添加函数体一样。这就是将类分离为.hpp和.cpp文件的原因。
注意:退役的忍者首先在帖子下面的评论中给出了答案。