2016-11-21 8 views
1

Mein Hauptrahmen in einem WxWidgets-Projekt startet einen Thread, wenn eine Schaltfläche gedrückt wird. Ich habe versucht, this example aus der Dokumentation der WxThread-Klasse zu verwenden, aber ich bekomme einen Fehler beim Kompilieren. Es sagtFriend-Klasse 'hat kein Mitglied mit Namen ...'

||=== Build: Debug in WindowsDgpsGUI (compiler: GNU GCC Compiler) ===| 
D:\WindowsDgpsGui\NavigationThread.cpp||In destructor 'virtual NavigationThread::~NavigationThread()':| 
D:\WindowsDgpsGui\NavigationThread.cpp|82|error: 'class wxFrame' has no member named 'm_navigationThreadCS'| 
D:\WindowsDgpsGui\NavigationThread.cpp|84|error: 'class wxFrame' has no member named 'm_navigationThread'| 
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===| 

Obwohl ich nicht finden, was ich falsch gemacht habe ... Dies ist der Code meines Hauptrahmen:

class WindowsDgpsGUIFrame: public wxFrame 
{ 

    public: 

     WindowsDgpsGUIFrame(wxWindow* parent,wxWindowID id = -1); 
     virtual ~WindowsDgpsGUIFrame(); 

    protected: 
     wxCriticalSection m_navigationThreadCS; //protects the m_navigationThread pointer 

     NavigationThread* m_navigationThread; 
     friend class NavigationThread; 
} 

Dies ist der Header des Themas:

class NavigationThread : public wxThread 
{ 

    public: 
     /** \name Constructor */ 
     NavigationThread(wxFrame* parent, navigation_variables usedVariables); 

     /** \name Destructor */ 
     virtual ~NavigationThread(); 
    private: 
     virtual ExitCode Entry(); 
     wxFrame* m_parent; 
} 

und dies der Destruktor des Fadens, wo der Fehler auftritt:

NavigationThread::~NavigationThread() 
{ 
    wxCriticalSectionLocker enter(m_parent->m_navigationThreadCS); 

    m_parent->m_navigationThread = NULL; 
    //dtor 
} 

Weiß jemand, was ich falsch gemacht habe? Jede Hilfe wird geschätzt.

+1

'wxFrame' enthält keine solchen Member, aber' WindowsDgpsGUIFrame' tut. Sie könnten den falschen Typ für 'm_parent' delcare? Sollte es nicht 'WindowsDgpsGUIFrame * m_parent;' sein? – songyuanyao

+1

'm_parent' ist ein Zeiger auf eine' wxFrame'-Instanz, die keines der gesuchten Mitglieder hat: die abgeleitete Klasse 'WindowsDgpsGUIFrame' hat sie. Um auf die Member-Variablen zugreifen zu können, können Sie 'm_parent' mit' dynamic_cast' in seinen Untertyp umwandeln, oder 'm_parent' als' WindowsDgpsGUIFrame * ' – wasthishelpful

Antwort

1

Wie der Fehler sagt: Die Klasse WindowsDgpsGUIFrame besitzt ein Mitglied m_navigationThreadCS. Die Basisklasse wxThread nicht.

Sie versuchen, die m_navigationThreadCS Membervariable durch einen wxThread

NavigationThread::~NavigationThread() 
{ 
    wxCriticalSectionLocker enter(m_parent->m_navigationThreadCS); 
            ^^^^^^^^ 

seit m_parent Zeiger von wxFrame* Art zuzugreifen, damit Ihre Fehler.

Sie können entweder dynamic_cast Ihre m_parent auf die abgeleitete Klasse, die es enthält oder nur diese Art ändern WindowsDgpsGUIFrame*

+0

deklarieren. Also müsste ich" WindowsDgpsGUIFrame "' im Header "#include", don Bin ich nicht? – Lehue

+0

Sie können einen Zeiger auf einen unvollständigen Typ deklarieren: einfach weiterleiten deklarieren Sie ihn mit einer Zeile 'class WindowsDgpsGUIFrame;' anstelle des '# include'. Sie müssen die Klassendeklaration bei der Verwendung einschließen, normalerweise in Ihrer cpp-Datei – wasthishelpful

+0

@ A.Hue Sorry, ich habe Ihren Kommentar falsch gelesen: ja richtig. Entweder erkläre deine Klasse als wasthishilful oder sag einfach den Header zusammen. –

0

So werden die Kommentare der vorherigen Antwort zusammenzufassen, das ist, wie es funktioniert:

NavigationThread.h:

class WindowsDgpsGUIFrame; // Forward declare wxFrame class 

/** \brief Class for working thread */ 
class NavigationThread : public wxThread 
{ 

    public: 
     /** \name Constructor */ 
     NavigationThread(WindowsDgpsGUIFrame* parent, navigation_variables usedVariables); 

     /** \name Destructor */ 
     virtual ~NavigationThread(); 
} 

NavigationThread.cpp

#include "WindowsDgpsGUIMain.h" // Include main class where frame is placed 

NavigationThread::NavigationThread(WindowsDgpsGUIFrame* parent, navigation_variables usedVariables) 
{} 

NavigationThread::~NavigationThread() 
{ 
    wxCriticalSectionLocker enter(m_parent->m_navigationThreadCS); 

    m_parent->m_navigationThread = NULL; 
    //dtor 
} 

Das Haupt bleibt das gleiche wie in der Frage.

Verwandte Themen