我不明白为什么在这个具体的例子中我得到一个未解析的外部符号。
我在头文件中定义了一个Rectangle结构。
我有一个Level类,当Level创建一个新玩家时,它有一个指向Player类的指针。
我的Player类,构造函数接收指向它的当前级别。
因为我的等级包括Player.h
,所以我在我的玩家类中转发声明等级以防止循环引用。
但是,当我尝试将一个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;
};
}
答案 0 :(得分:1)
您忘了在Rectangle构造函数上添加大括号。像这样:
Rectangle() {}
所以问题是你有定义而不是实现。你确实可以声明一个没有大括号的函数,但就像你向编译器做出一个承诺,即你要在其他地方添加函数体。这就是为什么将类分离为.hpp和.cpp文件的原因。
注意:已退休的忍者在帖子下方的评论中首先给出答案。