Ошибка C ++ LNK2019 с конструкторами и деструкторами в производных классах - PullRequest
7 голосов
/ 01 мая 2010

У меня есть два класса, один унаследован от другого. При компиляции я получаю следующие ошибки:

Entity.obj: ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Utility :: Parsables :: Base :: Base (void)" (?? 0Base @ Parsables @ Utility @@ QAE @ XZ), на который есть ссылка в функции "public : __thiscall Utility :: Parsables :: Entity :: Entity (void) "(?? 0Entity @ Parsables @ Utility @@ QAE @ XZ)

Entity.obj: ошибка LNK2019: неразрешенный внешний символ «public: virtual __thiscall Utility :: Parsables :: Base :: ~ Base (void)» (?? 1Base @ Parsables @ Utility @@ UAE @ XZ), на который есть ссылка в функции "public: virtual __thiscall Utility :: Parsables :: Entity :: ~ Entity (void)" (?? 1Entity @ Parsables @ Utility @@ UAE @ XZ)

D: \ Programming \ Projects \ Caffeine \ Debug \ Caffeine.exe: фатальная ошибка LNK1120: 2 неразрешенных внешних кода

Я действительно не могу понять, что происходит .. кто-нибудь может увидеть, что я делаю не так? Я использую Visual C ++ Express 2008. Вот файлы ..

"включить / Utility / Parsables / Base.hpp"

#ifndef CAFFEINE_UTILITY_PARSABLES_BASE_HPP
#define CAFFEINE_UTILITY_PARSABLES_BASE_HPP

namespace Utility
{
 namespace Parsables
 {
  class Base
  {
  public:
   Base( void );
   virtual ~Base( void );
  };
 }
}

#endif //CAFFEINE_UTILITY_PARSABLES_BASE_HPP

"SRC / Utility / Parsables / Base.cpp"

#include "Utility/Parsables/Base.hpp"

namespace Utility
{
 namespace Parsables
 {
  Base::Base( void )
  {
  }

  Base::~Base( void )
  {
  }
 }
}

"включить / Utility / Parsables / Entity.hpp"

#ifndef CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP
#define CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP

#include "Utility/Parsables/Base.hpp"

namespace Utility
{
 namespace Parsables
 {
  class Entity : public Base
  {
  public:
   Entity( void );
   virtual ~Entity( void );
  };
 }
}

#endif //CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP

"SRC / Utility / Parsables / Entity.cpp"

#include "Utility/Parsables/Entity.hpp"

namespace Utility
{
 namespace Parsables
 {
  Entity::Entity( void )
  {
  }

  Entity::~Entity( void )
  {
  }
 }
}

Ответы [ 3 ]

8 голосов
/ 01 мая 2010

Соответствующий бит такой:

unresolved external symbol "public: __thiscall Utility::Parsables::Base::Base(void)"

Необходимо указать определения для Base::Base и Base::~Base.Декларация недостаточно хороша.Даже если вам нечего делать в любой функции, вам нужно оставить пустое тело функции, потому что C ++ фактически требует, чтобы функция существовала.C ++ помещает такие вещи, как обслуживание виртуальных таблиц, в ваши конструкторы и деструкторы, поэтому они должны быть определены, даже если вам ничего не нужно делать - C ++ должен там что-то делать.

Вы уверены, что Base.cpp включен в сборку?

0 голосов
/ 11 октября 2016

Сегодня с такой же ошибкой столкнулся сегодня в Visual Studio 2015. К сожалению, принятый ответ не сработал (равно как и ответы на многие одинаковые вопросы). У меня сработало то, что щелкнул правой кнопкой мыши на файле cpp базового класса, исключил и снова включил его. Я думаю, что каким-то образом VS запутался при перемещении файла и переименовании, и просто молча отказался от его компиляции, хотя он был помечен как «Включено в проект» = true в редакторе свойств, а также указан в файле vcproj в группе. Это ужасная ошибка, и в итоге мы потратили на это хороший час.

0 голосов
/ 01 мая 2010

Либо ваш base.cpp не компилируется / не связан, либо в нем есть орфографическая ошибка

...