C++ 朋友班';没有名为…'的成员;
我在wxWidgets项目中的主框架在按下按钮时启动一个线程。我试图使用wxThread类的文档,但编译时出错。上面说C++ 朋友班';没有名为…'的成员;,c++,multithreading,friend,C++,Multithreading,Friend,我在wxWidgets项目中的主框架在按下按钮时启动一个线程。我试图使用wxThread类的文档,但编译时出错。上面说 ||=== Build: Debug in WindowsDgpsGUI (compiler: GNU GCC Compiler) ===| D:\WindowsDgpsGui\NavigationThread.cpp||In destructor 'virtual NavigationThread::~NavigationThread()':| D:\WindowsDgpsG
||=== 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
}
有人知道我做错了什么吗?非常感谢您的帮助。错误提示:类
WindowsDgpsGUIFrame
拥有一个成员m_navigationThreadCS
。基类wxThread
没有
您正试图通过wxThread
指针访问m_navigationThreadCS
成员变量
NavigationThread::~NavigationThread()
{
wxCriticalSectionLocker enter(m_parent->m_navigationThreadCS);
^^^^^^^^
由于m_parent
的类型为wxFrame*
,因此您的错误
您可以将
dynamic_cast
您的m_parent
转换为包含它的派生类,或者将该类型更改为WindowsDgpsGUIFrame*
,以便总结前面答案的注释,其工作原理如下:
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
}
main与问题中的相同。
wxFrame
不包含此类成员,但WindowsDgpsGUIFrame
包含此类成员。您可能为m_parent
指定了错误的类型?不应该是WindowsDgpsGUIFrame*m_parent
?m_parent
是指向wxFrame
实例的指针,该实例没有所需的成员:派生类WindowsDgpsGUIFrame
具有这些成员。要访问成员变量,可以使用dynamic\u cast
将m_parent
强制转换为其子类型,或者将m_parent
声明为WindowsDgpsGUIFrame*
,这样我就必须在标题中包含“WindowsDgpsGUIFrame”,不是吗?您可以声明一个指向不完整类型的指针:只需使用一行classwindowsdgpsguiframe向前声明它
而不是#include
。在使用类声明时,您必须包括它,通常是在您的cpp中file@A.Hue对不起,我误读了你的评论:是的,没错。向前声明您的类为wastThisHelp,或者只包含标题。但是在更改为WindowsDgpsGUIFrame*m_parent
后,错误显示WindowsDgpsGUIFrame没有命名类型
…因此我需要标题中的类,不是吗?因此,我必须在标题中向前声明它,或者包含它?@A.Hue Correct。