[英]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.