0

wxDialog から継承したクラスを書きました。私は現在、gcc 4.6 で Code::Blocks を使用して、Ubuntu 12.04 を使用しています。このクラスをプロジェクトに含めるまで、私のアプリケーションは正常に動作します。デバッグ構成とリリース構成のどちらでも同じエラーが発生します。コードは次のとおりです。

ヘッダーファイル

#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 のログは次のとおりです。

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[EBCDialog の vtable]+0x8): `EBCDialog::GetClassInfo() const' への未定義の参照 collect2:ld が 1 つの終了ステータスを返しましたプロセスはステータス 1 (0 分 2 秒) で終了しました 1 エラー、0 警告

どんな助けでも大歓迎です、ありがとう!

4

3 に答える 3

1

ルールは簡単です。 を使用する場合はDECLARE_CLASS()、 も使用する必要がありますIMPLEMENT_CLASS()。したがって、他の返信でアドバイスされているように、前者を削除するか、後者を追加する必要があります。

また、このクラスのオブジェクトを動的に (名前から) 作成する必要がない場合は、必要ないので削除する必要があります。ただし、単に例をコピーするのではなく、自分が何をしているのかを理解することをお勧めします。

于 2012-10-24T00:09:13.500 に答える
1

コードから DECLARE_CLASS(EBCDialog) を削除すると、基本クラスの wxDialog が既にそれを行っています。

ドキュメントから:

wxWidgets は独自の RTTI (「実行時型識別」) システムを使用します。これは現在の標準 C++ RTTI よりも前のものであり、後方互換性の理由から保持されていますが、標準 RTTI が直接サポートしていないもの (作成など) を許可するためでもあります。その名前からのクラス)。

標準の C++ RTTI は問題なくユーザー コードで使用できます。一般に、wxWidgets クラスを変更または追加することを考えていない限り、このセクションの関数とマクロを使用する必要はありません。

于 2012-10-23T17:17:50.270 に答える