2016-11-21 87 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 
} 

主要保留与问题中相同。

相关问题