简体   繁体   English

WxWidgets:麻烦调用wxFrame构造函数

[英]WxWidgets: Troubling Callling wxFrame ConstructorE

Okay, I have run into a really bizarre problem. 好吧,我遇到了一个非常奇怪的问题。

I have a wxWidgets program that has two frames, a main one, and a secondary one. 我有一个wxWidgets程序,它有两个框架,一个是主框架,一个是辅助框架。

The main one has a button that calls the second one to open. 主菜单有一个按钮,它调用第二个按钮来打开。

I had trouble with calling a derived class from the second wxframe's class, so I moved the declaration/implementation of the class to before the class for the main frame. 我在从第二个wxframe的类调用派生类时遇到了麻烦,因此我将类的声明/实现移到了主框架类的前面。

Now I am getting a compile error. 现在,我收到一个编译错误。

Here is the header file containing the derived wxFrame classes: 这是包含派生的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

Here is the header from which the classes derive: 这是类派生自的标头:

///////////////////////////////////////////////////////////////////////////
// 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__

This is the error I am getting: \\ NUEMain.h|23|error: no matching function for call to 'AssetEd::AssetEd()'| 这是我得到的错误:\\ NUEMain.h | 23 |错误:没有匹配的函数来调用'AssetEd :: AssetEd()'|

This is an error calling the constructor in the parent class, but I merely copied the way it was done for the original frame, which worked fine. 这是在父类中调用构造函数的错误,但是我只是复制了对原始框架的操作方式,效果很好。

What is up? 怎么了?

EDIT 1: 编辑1:

Okay, I replaced 好吧,我换了

NUEAsset(wxFrame *frame){} 

with

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

and it now fails in the linking stage with the following error: 现在它在链接阶段失败,并显示以下错误:

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

I can't make heads or tails of this error. 我无法弄清楚这个错误。

EDIT 2: 编辑2:

Oh, and I keep getting this warning as well, but I have been ignoring it. 哦,我也一直收到此警告,但我一直忽略它。 Could this be related: 这可能相关:

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

EDIT 3: I think I solved the problem using the information below and some digging. 编辑3:我想我使用下面的信息和一些挖掘解决了问题。

It turns out that I was defining some events for a frame that no longer had those events. 事实证明,我正在为不再具有这些事件的框架定义一些事件。

Changed the defs, and it seems to work now. 更改了defs,现在似乎可以使用了。

AssetEd does not have a default constructor. AssetEd没有默认的构造函数。 If you define any constructor of your own, the default constructor will not be implicitly provided. 如果定义自己的任何构造函数,则不会隐式提供默认构造函数。

The problem is that the base object of a derived class needs to be constructed somehow. 问题在于,需要以某种方式构造派生类的基础对象。 If you don't call a suitable constructor from the initializer list, the default constructor will be used implicitly. 如果您没有从初始化列表中调用合适的构造函数,则默认构造函数将被隐式使用。

NUEAsset must simply invoke the constructor of the base class with suitable arguments, eg NUEAsset必须简单地使用适当的参数调用基类的构造函数,例如

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM