2010-11-11 54 views
0

目前我正在一个GUI系统上,我已经由具有这种继承结构的GUIButton对象:C++指针模板类具有(虚拟)继承

GUIObject 
    | 
GUIImage 
    | 
GUIButton 

凡GUIObject是一个基类与一些虚拟功能(渲染,更新等)。

无论如何,由于我想要为GUI系统处理回调的方式,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的类 - 这可能是我的问题的原因吗?

我确定我所有的功能都已经实现了,所以问题不应该在那里。

如果有人能给我一些指点,我会很感激!

+0

注意*虚拟*继承是不同的东西;请参阅http://www.parashift.com/c++-faq-lite/multiple-inheritance.html。并改变你的问题标题! – 2010-11-11 16:28:07

+0

GUIObject具有虚拟功能...是不是那么虚拟继承? – Tomas 2010-11-11 16:30:30

+0

@Tomas虚拟功能意味着后期绑定。这与虚拟继承无关。 – 2010-11-11 16:31:36

回答

1

定义构造函数

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

    // Constructor // 
    GUIButton() : m_callTo(), m_callback() {} // <---- here 
+0

构造函数是否必须在类声明中定义? – Tomas 2010-11-11 16:27:09

+0

yes,or out of calss but in the h-file:'template GUIButton :: GUIButton():m_callTo(),m_callback(){}'。 – 2010-11-11 16:29:31

+0

其实''模板 GUIButton :: GUIButton():m_callTo(),m_callback(){} – 2010-11-11 16:30:41

0

你的错误消息说,这一切:

Undefined symbols: "GUIButton::GUIButton()", referenced from: ...

您已经声明,但没有定义GUIButton的构造。

+0

但我定义了它! – Tomas 2010-11-11 16:26:11

+0

@Tomas向我们展示定义(您可以跳过正文)。 – 2010-11-11 16:29:38

+1

@Thomas:仔细阅读我的答案!你有*声明*,但没有*定义*它。有两种方法来定义构造函数:在类中和外部。而且,对于模板类,您的构造函数必须定义为* inline *(例如不在'.cpp'文件中)。 – 2010-11-11 16:33:35