2015-04-05 2 views
-1

Я не понимаю, почему я получаю неразрешенный внешний символ в этом конкретном примере.Не понимаю, почему я получаю неразрешенный внешний символ?

У меня есть структура Rectangle, определенная в файле заголовка.

У меня есть класс уровня, который имеет указатель на класс Player, так как уровень создает нового игрока.

В моем классе Player конструктор берет указатель на текущий уровень.

Так как мой уровень включает в себя Player.h, я отправляю объявить уровень в моем классе Player, чтобы предотвратить круговую ссылку.

Однако, когда я пытаюсь добавить переменную-член 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

Покажите, что вы получили? Вы никогда не определяете конструктор по умолчанию Rectangle, AFAICS. –

+1

'Прямоугольник() {}' –

+0

ОН МОЙ БОГ. Ребята. Спасибо. Как я пропустил это. Кто-то создает ответ, и я отмечу его принятым. Я такой дуф. – Terry

ответ

1

Вы забыли добавить фигурные скобки на свой конструктор Rectangle. Сделайте это так:

Rectangle() {} 

Таким образом, проблема заключается в том, что у вас есть определение, но не реализация. Вы действительно можете объявить функцию без фигурных скобок, но это похоже на то, что вы обещаете компилятору, что вы собираетесь добавить тело функции в другое место. Вот почему работает разделение классов на файлы .hpp и .cpp.

Примечание: Отставной ниндзя дал ответ сначала в комментарии ниже сообщения.

Смежные вопросы