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

时间:2015-04-05 08:28:09

标签: c++

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

我在头文件中定义了一个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;
    };
}

1 个答案:

答案 0 :(得分:1)

您忘了在Rectangle构造函数上添加大括号。像这样:

Rectangle() {}

所以问题是你有定义而不是实现。你确实可以声明一个没有大括号的函数,但就像你向编译器做出一个承诺,即你要在其他地方添加函数体。这就是为什么将类分离为.hpp和.cpp文件的原因。

注意:已退休的忍者在帖子下方的评论中首先给出答案。