Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 朋友班';没有名为…'的成员;_C++_Multithreading_Friend - Fatal编程技术网

C++ 朋友班';没有名为…'的成员;

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

我在wxWidgets项目中的主框架在按下按钮时启动一个线程。我试图使用wxThread类的文档,但编译时出错。上面说

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