Я пытаюсь выучить c ++ с помощью wxWidgets. До сих пор все мои программы были написаны на простом 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 вернется к startUp выбранного устройства. Что у меня есть:
c2352 недопустимый вызов нестатической функции-члена . Поскольку элемент startUp не инициализирован, я должен был изменить в startup.h как функцию, так и переменную на static.
static void SetDevName(const wxString& devname);
static wxString devName;
Все исправлено - все файлы компилируются, но компоновщик говорит неразрешенный внешний символ "protected: статический класс wxString startUp :: devName" . Перемещение devName из защищенного в публичное ничего не меняет.
Может кто-нибудь объяснить мне, каков "правильный" способ передачи значений между классами? Я не хотел бы использовать глобальные переменные для ее решения. Видимо, это зло.