不明白为什么我得到一个未解析的外部符号?

  • 本文关键字:一个 符号 外部 明白 c++
  • 更新时间 :
  • 英文 :


我不明白为什么在这个特定的例子中会得到一个未解析的外部符号。

我在头文件中定义了一个矩形结构。

我有一个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文件的原因。

注意:退役的忍者首先在帖子下面的评论中给出了答案。

相关内容

  • 没有找到相关文章

最新更新