链接从wxDialog继承的类时出错

时间:2012-10-23 16:39:25

标签: c++ wxwidgets

我写了一个继承自wxDialog的类。我目前使用的是Ubuntu 12.04,使用带有gcc 4.6的Code :: Blocks。我的应用程序正常工作,直到我在项目中包含此类:调试和发布配置给出相同的错误。这是代码:

标头文件

#ifndef EBCDIALOG_H
#define EBCDIALOG_H

#include <wx/dialog.h>
#include <wx/sizer.h>
#include <wx/textctrl.h>
#include <wx/button.h>

class EBCDialog : public wxDialog
{
    public:

        EBCDialog(wxWindow* parent, wxWindowID id, const wxString& title );
        ~EBCDialog();

        void OnOK(wxCommandEvent& event);
    private:

       DECLARE_CLASS(EBCDialog)
        DECLARE_EVENT_TABLE()
};

#endif //EBCDIALOG_H

Cpp文件:

#include "EBCDialog.h"

EBCDialog::EBCDialog(wxWindow* parent, wxWindowID id, const wxString& title ) : wxDialog(parent, id, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
    wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
    // Create text ctrl with minimal size 100x60
    topSizer->Add(new wxTextCtrl(this, wxID_ANY, wxT("test"), wxDefaultPosition, wxSize(100,60)),
        1,  // make vertically stretchable
        wxEXPAND|   // make horizontally stretchable
        wxALL,      // and make border all around
        10);        // set border width to 10

    wxBoxSizer* buttonSizer = new wxBoxSizer( wxHORIZONTAL );
    buttonSizer->Add(new wxButton(this, wxID_OK, _T("OK")),
        0,  // make horizontally unstretchable
        wxALL,  // make border all around: implicit top alignment
        10);   // set border width to 10

    buttonSizer->Add(new wxButton(this, wxID_CANCEL, _T("Cancel")),
        0,  // make horizontally unstretchable
        wxALL,  // make border all around (implicit top alignment)
        10);   // set border width to 10

    topSizer->Add(buttonSizer,
    0,  // make vertically unstretchable
    wxALIGN_CENTER ); // no border and centre horizontally

    SetSizer( topSizer ); // use the sizer for layout
    topSizer->Fit( this );

    // fit the dialog to the contents
    topSizer->SetSizeHints( this ); // set hints to honor min size
}

EBCDialog::~EBCDialog()
{

}

void EBCDialog::OnOK(wxCommandEvent& event)
{

}

BEGIN_EVENT_TABLE(EBCDialog, wxDialog)
    EVT_BUTTON(wxID_OK, EBCDialog::OnOK)
END_EVENT_TABLE()

这是Code :: Blocks log:

  

g ++ -Wall -I / usr / lib / i386-linux-gnu / wx / include / gtk2-unicode-debug-2.8   -I / usr / include / wx-2.8 -D_FILE_OFFSET_BITS = 64 -D_LARGE_FILES -D_ WXDEBUG _ -D_ WXGTK _ -pthread -O2 -I“/ home / angelo / CodeBlocks / Event Bus Configurer / include“-I”/ home / angelo / CodeBlocks / Event Bus Configurer / bitmaps“-c”/ home / angelo / CodeBlocks / Event Bus Configurer / src / EBCDialog.cpp“-o   obj / src / EBCDialog.o g ++ -o“bin / Event Bus Configurer”obj / src / EBCApp.o   obj / src / EBCDialog.o obj / src / EBCFrame.o obj / src / EBCList.o   obj / src / HandlerFile.o -L / usr / lib / i386-linux-gnu -pthread   -Wl,-Bsymbolic-functions -Wl,-z,relro -L / usr / lib / i386-linux-gnu -lwx_gtk2ud_richtext-2.8 -lwx_gtk2ud_aui-2.8 -lwx_gtk2ud_xrc-2.8 -lwx_gtk2ud_qa-2.8 -lwx_gtk2ud_html-2.8 -lwx_gtk2ud_adv-2.8 -lwx_gtk2ud_core-2.8 -lwx_baseud_xml-2.8 -lwx_baseud_net-2.8 -lwx_baseud-2.8 -s obj / src / EBCDialog.o :(。rodata._ZTV9EBCDialog [vtable for EBCDialog] + 0x8):未定义的引用`EBCDialog :: GetClassInfo()   const'colle2:ld返回1退出状态进程终止于   状态1(0分,2秒)1个错误,0个警告

感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

从你的代码中删除DECLARE_CLASS(EBCDialog),基类wxDialog已经为你做了。

来自documentation

  

wxWidgets使用自己的RTTI(“运行时类型识别”)系统,该系统早于当前的标准C ++ RTTI,因此为了向后兼容性而保留,但也因为它允许标准RTTI不直接支持的某些内容(例如从名称中创建一个类。)

     

标准C ++ RTTI可以在用户代码中使用而不会出现任何问题。通常您不需要使用本节中的函数和宏,除非您考虑修改或添加任何wxWidgets类。

答案 1 :(得分:1)

我认为你不需要DECLARE CLASS。它是传统RTTI系统的一部分

http://docs.wxwidgets.org/2.8/wx_rttimacros.html

尝试删除该行。

答案 2 :(得分:1)

规则很简单:如果您使用DECLARE_CLASS(),则还必须使用IMPLEMENT_CLASS()。因此,您需要根据其他回复的建议删除前者,或者添加后者。

如果您不需要动态创建此类的对象(即从名称),您不需要它,所以您应该删除它。然而,理解你正在做什么而不仅仅是复制示例真的更好。