2016-11-21 88 views
1

我在wxWidgets項目中的主框架在按下按鈕時啓動線程。我嘗試從wxThread類的文檔中使用this example,但是編譯時出現錯誤。它說朋友班'沒有成員名爲''

||=== 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)) ===| 

雖然我無法找到我做錯了什麼...... 這是我的主框架的代碼:

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; 
} 

該線程的標題:

class NavigationThread : public wxThread 
{ 

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

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

並且這發生錯誤的線程的析構函數:

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

    m_parent->m_navigationThread = NULL; 
    //dtor 
} 

有誰知道我做錯了什麼?任何幫助表示讚賞。

+1

'wxFrame'不包含這些成員,但'WindowsDgpsGUIFrame'。你可能會忘記'm_parent'的錯誤類型?它不應該是'WindowsDgpsGUIFrame * m_parent;'? – songyuanyao

+1

'm_parent'是指向'wxFrame'實例的指針,它沒有任何想要的成員:派生類'WindowsDgpsGUIFrame'有它們。爲了訪問成員變量,你可以使用'dynamic_cast'將'm_parent'強制轉換爲其子類型,或者將m_parent'聲明爲'WindowsDgpsGUIFrame *' – wasthishelpful

回答

1

由於錯誤提示:類WindowsDgpsGUIFrame擁有會員m_navigationThreadCS。基類wxThread沒有。

你試圖通過wxThread指針

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

訪問m_navigationThreadCS成員變量,因爲m_parentwxFrame*型的,因此你的錯誤。

您可以dynamic_castm_parent包含它或者只是改變類型爲WindowsDgpsGUIFrame*

+0

因此,我將不得不在頭文件中包含「#WindowsDgpsGUIFrame」,不要我嗎? – Lehue

+0

你可以聲明一個指向不完整類型的指針:只需要用'class WindowsDgpsGUIFrame'代替'#include'來聲明它。您必須在使用它時包含類聲明,通常在您的cpp文件中 – wasthishelpful

+0

@ A.Hue對不起,我誤解了您的評論:是的。要麼將前面的課程聲明爲wasthishelpful說的,要麼僅僅包含頭部。 –

0

所以總結了以前的答案的評論派生類,這是它的工作原理:

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 
} 

主要保留與問題中相同。

相關問題