C ++: конструктор / деструктор не разрешен, когда не встроен? - PullRequest
1 голос
/ 05 мая 2010

В проекте C ++ на основе плагинов у меня есть TmpClass, который используется для обмена данными между основным приложением и плагинами. Поэтому соответствующий TmpClass.h включен в класс интерфейса абстрактного плагина, который включен в основной проект приложения и реализован каждым плагином.

Поскольку плагины работают с векторами STL экземпляров TmpClass, для TmpClass должен быть конструктор и деструктор по умолчанию. Я объявил это в TmpClass.h:

class TmpClass {
  TmpClass();
  ~TmpClass();
}

и реализовал их в TmpClass.cpp.

TmpClass::~TmpClass() {}
TmpClass::TmpClass() {}

Однако при компиляции плагинов это приводит к тому, что компоновщик жалуется на два неразрешенных внешних объекта - конструктор по умолчанию и деструктор TmpClass, как того требует экземпляр шаблона std::vector<TmpClass> - хотя все другие функции, которые я объявляю в TmpClass.h и реализовать в TmpClass.cpp работе. Как только я удаляю (пустой) конструктор и деструктор по умолчанию из файла .cpp и вставляю их в объявление класса в файле .h, плагины компилируются и работают.

Почему конструктор и деструктор по умолчанию имеют встроенный для компиляции этого кода? Почему это даже важно? (Я использую MSVC ++ 8).

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

Поведение, которое вы описываете, просто означает, что вы забыли включить файл TmpClass.cpp в проект.

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

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

Я предполагаю, что у вас есть один проект "основного приложения" и один или несколько проектов "плагинов", и похоже, что вы не включили TmpClass.cpp в проект плагинов. Я также предполагаю, что «все другие функции, которые вы объявляете в .h и реализуете в .cpp», используются только вашим основным проектом, а не вашими плагинами.

Как уже говорили другие, вы можете включить TmpClass.cpp в свои проекты плагинов. Другой вариант - создать dll-проект "sdk" и связать с ним основной и дополнительный модули.

Если вы все еще думаете, что ответы AndreyT неверны, вам следует предоставить дополнительную информацию о структуре ваших проектов.

...