Хорошо, я столкнулся с действительно причудливой проблемой.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: Я думаю, что я решил эту проблему, используя приведенную ниже информацию и некоторые рыть.
Оказывается, я определял некоторые события для рамки, у которой больше не было этих событий.
Изменил настройки, и он теперь работает.
Хорошо, теперь его получить действительно странные ошибки:)] + 0x7E) || неопределенная ссылка на 'виртуальные таблицы для NUEAsset» | – Biosci3c
Он делает это иногда, и я не знаю, почему. Это даже не определение места в файле заголовка, где проблема. Кроме того, даже более странным является тот факт, что это то же самое, что и для другого фрейма (без вызова конструктора по умолчанию, и он отлично работает). – Biosci3c