【问题标题】:c++ error: invalid use of member 'calls_object::OBJECT' in static member functionc++错误:在静态成员函数中无效使用成员'calls_object::OBJECT'
【发布时间】:2013-03-03 13:54:22
【问题描述】:

我从下面的代码中得到以下错误。

error: invalid use of member 'calls_object::OBJECT' in static member function| error: from this location

OBJECT->call();第29行开始。

基本上该函数必须是静态的,因为它实际上是代码的简化版本 它创建了一个 Windows 线程。我似乎无法在静态函数中使用指针,但我可以在静态函数中创建对象没问题。还有其他方法吗?

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)windowsthread, (LPVOID)i, NULL, &m_id);

static DWORD_PTR WINAPI windowsthread()
{
    OBJECT->call();
}

l

class object
{
        private:

        public:

        object(){}
        ~object(){}
        void call(){}
};
class calls_object
{
    private:

        object* OBJECT;

    public:

    calls_object()
    {
        OBJECT = new object();
    }
    ~calls_object(){}

    #ifdef _WIN32
    static void windows_function()
    {
        OBJECT->call();
    }
    #endif
};
int main()
{
    calls_object O;

}

【问题讨论】:

    标签: c++ windows multithreading function static


    【解决方案1】:

    这个函数:

    static void windows_function()
    {
        OBJECT->call();
    }
    

    声明为static。这意味着它没有收到隐式的this 指针:换句话说,它不在calls_objectinstance 上运行。因此,它看不到OBJECT 成员变量。

    要么将函数声明为非静态函数,要么将 OBJECT 声明为 static 成员变量(在您的应用程序中更有意义)。

    基本上该函数必须是静态的,因为它实际上是创建 Windows 线程的代码的简化版本

    由于您(不幸地)正在处理一个接受函数指针的函数 (CreateThread),因此您甚至不能使用 std::bind。但是,CreateThread 允许您提供一个接受指针的函数(指向void,参见ThreadProc 的原型)。

    只需将指向object 的指针作为CreateThread 的第四个参数传递,然后让windowsFunction(void*) 接收该指针。在windowsFunction() 内部,它仍然是static 或全局(实际上,您根本不需要calls_object 类),您可以将该指针转换为指向object 的指针并在其上调用call() .


    还要注意,你的类calls_object 正在泄漏内存,因为你忘记了deletecalls_object 的构造函数中创建的指针:

    ~calls_object() 
    { 
        delete object; // DON'T FORGET THIS!
    }
    

    【讨论】:

    • OBJECT as a static 我不知道该怎么做。能举个例子吗?
    • @lost_with_coding:老实说,我认为你不想要整个班级calls_object
    • 当然这不是我编造的一个简单例子。我通常只使用大写字母来显示错误的最小示例。
    • “只需将一个指向对象的指针作为第四个参数传递给 CreateThread,然后让 windowsFunction(void*) 接收该指针。”参数(LPTHREAD_START_ROUTINE)threadMain 呢?你发给我的参考页面说它可能会导致 64 位窗口崩溃,所以我绝对希望它消失。我把它留空吗?您能否发布 CreateThread 函数在传递对象指针时应该是什么样子?函数static DWORD_PTR WINAPI threadMain() 会发生什么?
    【解决方案2】:

    windows_function 是一个静态成员函数,因此不与任何calls_object 对象关联。 OBJECT 是非static 数据成员,因此与calls_object 对象相关联。您不能从数据成员访问非static 数据成员。

    只需将函数设为非static 即可。

    这样想。如果您甚至没有创建 calls_object 类型的对象,而您的 main 函数只是:

    int main()
    {
      calls_object::windows_function();
    }
    

    你希望这个函数从哪里得到OBJECT?由于OBJECT 是非static 成员,它仅作为calls_object 对象的一部分存在。 static 成员函数不能简单地从任何地方拉出 OBJECT

    【讨论】:

    • "只需使函数非静态,它就会工作。"是的,我编写的程序可以运行,但是这个CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)windowsthread, (LPVOID)i, NULL, &m_id); 出于某种原因需要静态 windowsthread 函数?
    • @lost_with_coding 是的,该函数必须采用static 函数。因此,要么重新设计你的代码使其完全静态,要么你必须使用std::bind 将非static windows_function 绑定到一个对象,然后再将其传递给CreateThread
    猜你喜欢
    • 2013-06-27
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多