我正在嘗試使用wxWidgets學習C++。直到現在,我所有的程序都是用純C語言編寫的(不需要對象),vba,bash--就像你看到我不是程序員。對非靜態成員或無法解析的外部符號的非法引用
即使這個例子中的wxWidgets的幀是一般C++問題(實際上這是我的問題與C++ ;-)
主窗口具有菜單欄具有子菜單設置/通信。 我已經定義一個類,在startup.h主框架:
class startUp: public wxFrame
{
DECLARE_CLASS(startUp)
DECLARE_EVENT_TABLE()
public:
startUp();
startUp(wxWindow* parent, wxWindowID id = SYMBOL_....
~startUp();
void OnMENUCommunicationClick(wxCommandEvent& event);
....
void SetDevName(const wxString& devname);
protected:
static wxString devName;
};
和startup.cpp:
....
void startUp::SetDevName(const wxString& devname)
{
devName=_T(devname);
}
的OnMENUCommunicationClick調用應返回一個對話框在wxChoice中選擇的設備名稱(順便說一句,餵食wxChoice作品)。在另一個類中定義該對話框:
#include "startup.h"
class Communication: public wxFrame
{
....
void Communication::CreateControls();
protected:
wxArrayString portChoiceStrings;
communication.cpp:
...
void Communication::CreateControls()
std::vector<std::string> ports;
int count = ScanSerialPorts(ports, true);
for(int i = 0; i < count; i++) {
portChoiceStrings.Add(wxString(ports[ i ].c_str(), wxConvUTF8));
}
portChoice = new wxChoice(itemPanel2, ID_ComportSet, wxPoint(108, 25), wxSize(55, -1), portChoiceStrings, 0);
portChoice->SetSelection(0);
....
}
void Communication::OnOKClick(wxCommandEvent& event)
{
startUp::SetDevName(_T(portChoiceStrings[portChoice->GetSelection()]));
//startUp::SetDevName(wxT(""));
Destroy();
}
現在我的問題,我希望OnOKClick將返回啓動選定的設備。我得到的是: c2352非法調用非靜態成員函數。由於startUp的成員未初始化,因此我的選項是將startup.h中的函數和變量都更改爲靜態。
static void SetDevName(const wxString& devname);
static wxString devName;
的東西改善 - 所有文件編譯,但連接器說解析的外部符號「受保護:靜態類wxString啓動:: DEVNAME」。移動devname從保護到公共不會改變一件事。
有人可以解釋什麼是在類之間傳遞值的「正確」方式嗎?我不想用全局變量來解決它。顯然這些都是邪惡的。
這是一個(如果你的對話框是非模態的,你必須有這樣的鏈接)如果你的對話框是模態的,那麼你的框架對象可能會更有意義。 ,然後在返回結果時讀取它的值,兩種方法都可以工作,我寧願將鏈接傳遞給對話框的構造函數,因爲它顯示對話框*需要*鏈接正常執行。 – araqnid 2012-01-04 19:01:23