недопустимая ссылка на нестатический элемент или неразрешенный внешний символ - PullRequest
0 голосов
/ 03 января 2012

Я пытаюсь выучить 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 из защищенного в публичное ничего не меняет.

Может кто-нибудь объяснить мне, каков "правильный" способ передачи значений между классами? Я не хотел бы использовать глобальные переменные для ее решения. Видимо, это зло.

1 Ответ

1 голос
/ 04 января 2012

Я нашел решение.Я удалил слово static из определений.

В классе startup после инициализации диалогового окна я добавил вызов функции 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 была определена в communication.h как член класса startUp:

startUp* m_relative;   

Все работает ( т.е. программа компилирует и связывает без ошибок, а для переменной devName из startUp-Frame устанавливается значение, считываемое из меню «Связь».

...