Указатель C ++ на шаблонный класс с (виртуальным) наследованием - PullRequest
0 голосов
/ 11 ноября 2010

В настоящее время я работаю в системе с графическим интерфейсом и создал объект GUIButton, который имеет такую ​​структуру наследования:

GUIObject
    |
GUIImage
    |
GUIButton

Где GUIObject - это базовый класс с некоторыми виртуальными функциями (render, updateи т. д.).

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

Вот файл заголовка:

 #include "GUIImage.h"

template<class CallbackClass> 
class GUIButton : public GUIImage
{
public:

    // Constructor //
    GUIButton();

    // GUIObject Overides //

    bool update(const GUIUpdateInfo& updateInfo);
    void update();

    void render(const GUIRenderInfo& renderInfo);

    string getType();

    // Callback //

    void setCallback(void (CallbackClass::* callback)(), CallbackClass* instance);

    // Destructor //
    ~GUIButton();

private:

    void (CallbackClass::*  m_callback)();
    CallbackClass*          m_callTo; 
};

Вы можете видеть, что это также функция setCallBack, которая устанавливает метод из CallbackClass и конкретный экземпляр, который будет использоваться.

В любом случае, после всего этого мой код компилируется нормально, но в тот момент, когда я пытаюсь использовать новый класс, я получаю следующую ошибку компоновки:

    Undefined symbols:
  "GUIButton<GUIAppTest>::GUIButton()", referenced from:
      GUIAppTest::GUIAppTest()in GUIAppTest.o
      GUIAppTest::GUIAppTest()in GUIAppTest.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Я работаю с Xcode в качестве IDE, поэтомуФормат ошибки может немного отличаться от обычного.

Код, который использует класс, выглядит примерно так:

GUIButton<GUIAppTest>* newButton = new GUIButton<GUIAppTest>();

newButton->loadImage("Data/Sketch.png", 1);
newButton->setTextureCoordinates(0.0, 0.0, 1.0, 1.0);
newButton->setLocationCoordinates(0.0, 0.0, 84, 84);

newButton->setCallback(&GUIAppTest::onClick, this);

m_objects.push_back(newButton);

Проблема, вероятно, очень проста, но я застрял здеськакое-то время, так что я подумал, что я мог бы также получить некоторую помощь.Использование GUIButton фактически происходит в реализации GUIAppTest - класса, который передается в качестве шаблона GUIButton - Может ли это быть причиной моей проблемы?

Я уверен, что все мои функции были реализованытакже проблема не должна лежать там.

Если бы кто-нибудь мог дать мне несколько советов, я был бы очень признателен!

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Определить конструктор

template<class CallbackClass>  
class GUIButton : public GUIImage 
{ 
public: 

    // Constructor // 
    GUIButton() : m_callTo(), m_callback() {} // <---- here 
0 голосов
/ 11 ноября 2010

В вашем сообщении об ошибке все сказано:

Неопределенные символы: "GUIButton :: GUIButton ()", на которые ссылаются: ...

Вы объявили, но не определили конструктор GUIButton.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...