2010-10-17 2 views
0

Хорошо, я столкнулся с действительно причудливой проблемой.WxWidgets: Troubling Callling wxFrame ConstructorE

У меня есть программа wxWidgets, которая имеет два кадра, основной и вторичный.

Основная кнопка имеет кнопку, которая вызывает вторую для открытия.

У меня возникли проблемы с вызовом производного класса из второго класса wxframe, поэтому я переместил объявление/реализацию класса перед классом для основного фрейма.

Теперь я получаю ошибку компиляции.

Вот заголовочный файл, содержащий производные классы wxFrame:

/*************************************************************** 
* Name:  NUEMain.h 
* Purpose: Defines Application Frame 
* Author: Cypher() 
* Created: 2010-10-02 
* Copyright: Cypher() 
* License: 
**************************************************************/ 
#include "System.h" 
#ifndef NUEMAIN_H 
#define NUEMAIN_H 


#include "NUEApp.h" 
#include "GUIFrame.h" 
#include "System.h" 
#include <wx/wx.h> 


class NUEAsset : public AssetEd 
{ 
    public: 
     NUEAsset(wxFrame *frame){} <-- Error here 
     ~NUEAsset(){}; 

     //Xml object 
     XmlO SysX; 
    private: 
     virtual void OnClose(wxCloseEvent& event); 
     virtual void OnQuit(wxCommandEvent& event); 
     virtual void OnAbout(wxCommandEvent& event); 

     //Open File Event 
     virtual void OpenFile(wxCommandEvent& event){ 
      wxFileDialog* OpenDialog = new wxFileDialog(
      this, _("Choose a file to open"), wxEmptyString, wxEmptyString,_("XML Files (*.xml)|*.xml"),wxFD_OPEN, wxDefaultPosition); 

      // Creates a "open file" dialog with 4 file types 
      if (OpenDialog->ShowModal() == wxID_OK) // if the user click "Open" instead of "Cancel" 
      { 
       //Change Statusbar to display path of opened file 
       SetStatusText(OpenDialog->GetPath(),0); 

       //Set m_SysListBox contents to names from ssys.xml 
       SysX.load(OpenDialog->GetPath()); 
       Asset assetsys; 
       //Start adding names to m_SysListbox 
       //Pointer to system 
       for(int i = 0; i < SysX.Sys.size(); i++){ 
        assetsys = SysX.Sys.at(i); 
        //Get name of system as string 
        //Convert name from string to wxString 
        m_SysListBox->AppendString(assetsys.name); 
       } 
       // MainEditBox->LoadFile(CurrentDocPath); //Opens that file 
      } 
       //SetTitle(wxString("Edit - ") <<OpenDialog->GetFilename()); // Set the Title to reflect the file open 


     // Clean up after ourselves 
     OpenDialog->Destroy(); 


     } 
     //Handle clicking on a system 
     virtual void sys_click(wxCommandEvent& event) { 
      //Get the index of the selected item 
      int ind; 
      ind = m_SysListBox->GetSelection(); 

      wxString tmp_sys_nam; 
      wxString tmp_x; 
      wxString tmp_y; 

      tmp_sys_nam = SysX.Sys.at(ind).name; 
      tmp_x << SysX.Sys.at(ind).x_pos; 
      tmp_y << SysX.Sys.at(ind).y_pos; 

      //Set the asset name listbox 
      m_textPNAME->ChangeValue(tmp_sys_nam); 

      //Set the X_pos listbox 
      m_textRadius->ChangeValue(tmp_x); 

      //Set the Y_pos listbox 
      m_textStars->ChangeValue(tmp_y); 

     } 
}; 


class NUEFrame: public GUIFrame 
{ 
    public: 
     NUEFrame(wxFrame *frame); 
     ~NUEFrame(); 

     //Xml object 
     XmlO SysX; 
    private: 
     virtual void OnClose(wxCloseEvent& event); 
     virtual void OnQuit(wxCommandEvent& event); 
     virtual void OnAbout(wxCommandEvent& event); 

     //Launch Asset Editor 
     virtual void launch_asset_ed(wxCommandEvent& event) { 
      NUEAsset* asset_ed_frame = new NUEAsset(0L); 
      asset_ed_frame->SetIcon(wxICON(aaaa)); // To Set App Icon 
      asset_ed_frame->Show(); 

     } 

     //Open File Event 
    /* virtual void OpenFile(wxCommandEvent& event){ 
      wxFileDialog* OpenDialog = new wxFileDialog(
      this, _("Choose a file to open"), wxEmptyString, wxEmptyString,_("XML Files (*.xml)|*.xml"),wxFD_OPEN, wxDefaultPosition); 

      // Creates a "open file" dialog with 4 file types 
      if (OpenDialog->ShowModal() == wxID_OK) // if the user click "Open" instead of "Cancel" 
      { 
       //Change Statusbar to display path of opened file 
       SetStatusText(OpenDialog->GetPath(),0); 

       //Set m_SysListBox contents to names from ssys.xml 
       SysX.load(OpenDialog->GetPath()); 
       Asset assetsys; 
       //Start adding names to m_SysListbox 
       //Pointer to system 
       for(int i = 0; i < SysX.Sys.size(); i++){ 
        assetsys = SysX.Sys.at(i); 
        //Get name of system as string 
        //Convert name from string to wxString 
        m_SysListBox->AppendString(assetsys.name); 
       } 
       // MainEditBox->LoadFile(CurrentDocPath); //Opens that file 
      } 
       //SetTitle(wxString("Edit - ") <<OpenDialog->GetFilename()); // Set the Title to reflect the file open 


     // Clean up after ourselves 
     OpenDialog->Destroy(); 


     } */ 
     //Handle clicking on a system 
    /* virtual void sys_click(wxCommandEvent& event) { 
      //Get the index of the selected item 
      int ind; 
      ind = m_SysListBox->GetSelection(); 

      wxString tmp_sys_nam; 
      wxString tmp_x; 
      wxString tmp_y; 

      tmp_sys_nam = SysX.Sys.at(ind).name; 
      tmp_x << SysX.Sys.at(ind).x_pos; 
      tmp_y << SysX.Sys.at(ind).y_pos; 

      //Set the asset name listbox 
      m_textPNAME->ChangeValue(tmp_sys_nam); 

      //Set the X_pos listbox 
      m_textRadius->ChangeValue(tmp_x); 

      //Set the Y_pos listbox 
      m_textStars->ChangeValue(tmp_y); 

     }*/ 
}; 

#endif // NUEMAIN_H 

Вот заголовок, из которого классы наследуют:

/////////////////////////////////////////////////////////////////////////// 
// C++ code generated with wxFormBuilder (version Sep 8 2010) 
// http://www.wxformbuilder.org/ 
// 
// PLEASE DO "NOT" EDIT THIS FILE! 
/////////////////////////////////////////////////////////////////////////// 

#ifndef __GUIFrame__ 
#define __GUIFrame__ 

#include <wx/string.h> 
#include <wx/button.h> 
#include <wx/gdicmn.h> 
#include <wx/font.h> 
#include <wx/colour.h> 
#include <wx/settings.h> 
#include <wx/sizer.h> 
#include <wx/bitmap.h> 
#include <wx/image.h> 
#include <wx/icon.h> 
#include <wx/menu.h> 
#include <wx/frame.h> 
#include <wx/stattext.h> 
#include <wx/listbox.h> 
#include <wx/textctrl.h> 
#include <wx/toolbar.h> 
#include <wx/statusbr.h> 

/////////////////////////////////////////////////////////////////////////// 

#define idMenuQuit 1000 
#define idMenuAbout 1001 

/////////////////////////////////////////////////////////////////////////////// 
/// Class GUIFrame 
/////////////////////////////////////////////////////////////////////////////// 
class GUIFrame : public wxFrame 
{ 
private: 

protected: 

    wxButton* m_buttonAsset; 
    wxButton* m_buttonShip; 


    wxButton* m_buttonTech; 
    wxButton* m_buttonOutfit; 

    wxMenuBar* m_menubar2; 
    wxMenu* m_file; 

    // Virtual event handlers, overide them in your derived class 
    virtual void OnClose(wxCloseEvent& event) { event.Skip(); } 
    virtual void launch_asset_ed(wxCommandEvent& event) { event.Skip(); } 


public: 

    GUIFrame(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("NUE v0.0.1a"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(-1,-1), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL); 
    ~GUIFrame(); 

}; 

/////////////////////////////////////////////////////////////////////////////// 
/// Class AssetEd 
/////////////////////////////////////////////////////////////////////////////// 
class AssetEd : public wxFrame 
{ 
private: 

protected: 
    wxMenuBar* mbar; 
    wxMenu* fileMenu; 
    wxMenu* helpMenu; 
    wxStaticText* m_staticTextSysboxlabel; 
    wxListBox* m_SysListBox; 
    wxStaticText* m_staticParamslabel; 
    wxStaticText* m_staticText4; 
    wxTextCtrl* m_textPNAME; 
    wxStaticText* m_staticText5; 
    wxTextCtrl* m_textRadius; 
    wxStaticText* m_staticText6; 
    wxTextCtrl* m_textStars; 
    wxStaticText* m_staticText61; 
    wxTextCtrl* m_textInterference; 
    wxStaticText* m_staticText611; 
    wxStaticText* m_staticText612; 
    wxTextCtrl* m_textPosX; 
    wxStaticText* m_staticText6121; 
    wxTextCtrl* m_textPosY; 
    wxStaticText* m_staticLinksLabel; 
    wxListBox* m_SysHyperlinkslist; 
    wxToolBar* m_toolBar1; 
    wxStatusBar* statusBar; 

    // Virtual event handlers, overide them in your derived class 
    virtual void OpenFILE(wxCommandEvent& event) { event.Skip(); } 
    virtual void OnQuit(wxCommandEvent& event) { event.Skip(); } 
    virtual void OnAbout(wxCommandEvent& event) { event.Skip(); } 
    virtual void sys_click(wxCommandEvent& event) { event.Skip(); } 


public: 

    AssetEd(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(915,500), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL); 
    ~AssetEd(); 

}; 

#endif //__GUIFrame__ 

Это ошибка я получаю: \ Ошибка NUEMain.h | 23 |: нет соответствующей функции для вызова в AssetEd :: AssetEd() '|

Это ошибка, вызывающая конструктор в родительском классе, но я просто скопировал то, как это было сделано для исходного фрейма, который работал нормально.

Что случилось?

EDIT 1:

Хорошо, я заменил

NUEAsset(wxFrame *frame){} 

с

NUEAsset(wxFrame *frame): AssetEd(frame){} 

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

)]+0x7e)||undefined reference to `vtable for NUEAsset'| 

Я не могу сделать h eads или хвосты этой ошибки.

EDIT 2:

О, и я получаю это предупреждение, а также, но я игнорировала его. Может ли это быть связано:

||warning: auto-importing has been activated without --enable-auto-import specified on the command line.| 

EDIT 3: Я думаю, что я решил эту проблему, используя приведенную ниже информацию и некоторые рыть.

Оказывается, я определял некоторые события для рамки, у которой больше не было этих событий.

Изменил настройки, и он теперь работает.

ответ

1

AssetEd не имеет конструктора по умолчанию. Если вы определяете свой собственный конструктор, конструктор по умолчанию не будет неявно предоставлен.

Проблема в том, что базовый объект производного класса должен быть каким-то образом сконструирован. Если вы не вызываете подходящий конструктор из списка инициализаторов, конструктор по умолчанию будет использоваться неявно.

NUEAsset должен просто вызывать конструктор базового класса с соответствующими аргументами, например

NUEAsset(wxFrame *frame): Asset(frame) {} 
+0

Хорошо, теперь его получить действительно странные ошибки:)] + 0x7E) || неопределенная ссылка на 'виртуальные таблицы для NUEAsset» | – Biosci3c

+0

Он делает это иногда, и я не знаю, почему. Это даже не определение места в файле заголовка, где проблема. Кроме того, даже более странным является тот факт, что это то же самое, что и для другого фрейма (без вызова конструктора по умолчанию, и он отлично работает). – Biosci3c