2012-01-03 54 views
0

我正在嘗試使用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從保護到公共不會改變一件事。

有人可以解釋什麼是在類之間傳遞值的「正確」方式嗎?我不想用全局變量來解決它。顯然這些都是邪惡的。

回答

1

我找到了解決辦法。我已經從定義中刪除單詞static

在對話窗口的初始化後類啓動我已經添加一個調用函數setLink:在

void startUp::OnMENUCommunicationClick(wxCommandEvent& event) 
    { 
    Communication* window = new Communication(this,ID_COMMUNICATION, _("Communication Settings")); 
    window->setLink(this); 
    int returnValue = window->Show(); 
    } 

比通訊我添加了一個鏈接功能setLink存儲的主要指針窗口:

void Communication::setLink(startUp* papi) 
    { 
    this->m_link = papi; 
    } 

,我可以在OnSetClick使用:

void Communication::OnSetClick(wxCommandEvent& event) 
    { 
    m_link->SetDevName(_T(portChoiceStrings[portChoice->GetSelection()])); 
    Destroy(); 
    } 

m_link變量在通信中定義。^ h作爲啓動類的成員:

startUp* m_relative; 

一切正常(程序編譯並沒有錯誤和啓動幀的DEVNAME變量鏈接設置爲從通信菜單讀值

+0

這是一個(如果你的對話框是非模態的,你必須有這樣的鏈接)如果你的對話框是模態的,那麼你的框架對象可能會更有意義。 ,然後在返回結果時讀取它的值,兩種方法都可以工作,我寧願將鏈接傳遞給對話框的構造函數,因爲它顯示對話框*需要*鏈接正常執行。 – araqnid 2012-01-04 19:01:23

相關問題