2016-03-04 5 views
1

Я пытаюсь создать DLL, которая будет управлять различными параметрами конфигурации для моего проекта как Singleton.Чистые виртуальные функции, не определенные в Singleton DLL

Я следовал метод, предложенный here in the chosen answer, как показано ниже:

IBuildConfiguration.h

#if defined(BUILD_CONFIGURATION_LIBRARY_EXPORT) 
# define BUILD_CONFIGURATION_API __declspec(dllexport) 
#else 
# define BUILD_CONFIGURATION_API __declspec(dllimport) 
#endif // BUILD_CONFIGURATION_LIBRARY_EXPORT 

class IBuildConfiguration 
{ 
    public: 
     virtual int foo(void) = 0; 
}; 

BUILD_CONFIGURATION_API IBuildConfiguration& Instance(void); 

BuildConfiguration.h

class BuildConfiguration : public IBuildConfiguration 
{ 
    public: 

     BuildConfiguration(); 
     ~BuildConfiguration(); 


     virtual int foo(void); 
}; 

Edit: Забыл включить я зация Instance()

BuildConfiguration.cpp

int BuildConfiguration::foo(void) 
{ 
    return 1; //just a silly example 
} 

IBuildConfiguration& Instance(void) 
{ 
    static BuildConfiguration instance; 
    return instance; 
} 

Теперь в Visual C++ 6, я добавил к моему проекту зависимости от этой новой DLL, и я включил IBuildConfiguration заголовка в моем источнике как таковой:

SystemCtrl.cpp

#include "../../BuildConfiguration/IBuildConfiguration.h" 

IBuildConfiguration buildConfig = Instance(); 

Наша библиотека успешно сработала, однако проект, который ее использует, не работает.

К сожалению, это приводит к следующей ошибке:

int __thiscall IBuildConfiguration::foo(void)' : pure virtual function was not defined 

копирование DLL и LIB файлы в проект, кажется, не решить эту проблему.

+0

Я думаю, что метод Instance пытается создать экземпляр вашего базового класса. что невозможно сделать по причине, о которой сообщается. – Rob

+0

@Rob Смотрите мой комментарий ниже; мой плохой, я не обеспечил реализацию 'Instance()' – audiFanatic

ответ

2

Если IBuildConfiguration не имеют чисто виртуальную функцию, это будет по-прежнему не работает, как вы ожидали:

IBuildConfiguration buildConfig = Instance(); 

Это в основном говорит «копирования построить экземпляр IBuildConfiguration из возвращаемого значения Instance()» , Информация о производном классе теряется. Это нарезка. Вам нужна ваша переменная для ссылки:

IBuildConfiguration& buildConfig = Instance(); 
+0

Я как раз собирался обновить свой ответ с помощью это :) поздравляю. который должен это сделать. – Rob

+0

Это действительно решает проблему, однако теперь я получаю еще одну ошибку: 'неразрешенный внешний символ '__declspec (dllimport) класс IBuildConfiguration & __cdecl Экземпляр (void)" ' – audiFanatic

+0

Тогда вы неправильно ссылались на' .lib' файл для вашей DLL. Я точно не помню, как это сделать, но в вариантах компоновщика. (Прошло не менее 8 лет с тех пор, как я использовал VC++ 6.) –

2

убедитесь, что ваш метод Instance выглядит следующим образом

IBuildConfiguration& Instance() 
{ 
    // Creates instance of derived class all is good. 
    static BuildConfiguration inst; 
    return inst; 
} 

и не:

IBuildConfiguration& Instance() 
{ 
    // Tries to create instance of base class.. Not possible as it 
    // has pure virtual functions. 
    static IBuildConfiguration inst; 
    return inst; 
} 

Темный Сокол прав, Вы должны сохранить отдачу от метода Instance() в отношении базовый класс или он попытается создать новый экземпляр базового класса, вызвав конструкцию копии базового класса той же самой проблемой :).

+0

Упс, это была моя ошибка, я забыл включить реализацию «Экземпляр() в моем исходном ответе – audiFanatic

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