【问题标题】:Error while linking a class inherited from wxDialog链接从 wxDialog 继承的类时出错
【发布时间】:2012-10-13 16:06:01
【问题描述】:

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

头文件

#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()

这里是代码::块日志:

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/事件总线配置器/包括“-I”/home/angelo/CodeBlocks/事件总线配置器/位图”-c“/home/angelo/CodeBlocks/事件总线配置器/src/EBCDialog.cpp”-o obj/src/EBCDialog.o g++ -o "bin/事件总线配置器" 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_ad -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[用于 EBCDialog 的 vtable]+0x8): 未定义引用 `EBCDialog::GetClassInfo() const' collect2: ld 返回 1 退出状态进程终止于 状态 1(0 分 2 秒)1 个错误,0 个警告

感谢您的帮助,谢谢!

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

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

    如果您不需要动态创建此类的对象(即从名称),则不需要它,因此您确实应该删除它。但是,最好了解你在做什么,而不是仅仅复制示例。

    【讨论】:

    • 感谢您的提示。能帮我一下吗?我想看看你所说的样本......因为我来自意大利而且我不是一个熟练的英语演讲者,我不确定我是否明白你想要告诉我的...... . 谢谢你
    【解决方案2】:

    我认为您不需要 DECLARE_CLASS。它是传统 RTTI 系统的一部分

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

    尝试删除该行。

    【讨论】:

    • 太伤心了,我从一个DOC中拿了一个例子,我不得不在我5年前做的一个旧项目上使用它......我对此一无所知,谢谢!抱歉,但我必须选择以前的答案作为解决方案……无论如何,我对您的答案进行了评分。再次感谢你们!
    【解决方案3】:

    从您的代码中删除 DECLARE_CLASS(EBCDialog),基类 wxDialog 已经为您完成了这项工作。

    来自documentation

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

    标准的 C++ RTTI 可以毫无问题地在用户代码中使用,一般来说,除非您考虑修改或添加任何 wxWidgets 类,否则您不需要使用本节中的函数和宏。

    【讨论】:

    • 哦,我的...我在书中举了一个例子! -.- 如果你继续成为我的问题解决者,我想我需要你的 IBAN 或类似的东西......:P 像往常一样谢谢你:°D
    猜你喜欢
    • 2021-05-12
    • 2021-05-25
    • 2021-06-05
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多