c ++错误:在静态成员函数中无效使用成员'calls_object :: OBJECT'

时间:2013-03-03 13:54:22

标签: c++ windows multithreading function static

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

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

1

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;

}

2 个答案:

答案 0 :(得分:2)

此功能:

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

声明为static。这意味着它不会收到隐式this指针:换句话说,它不会在calls_object实例上运行。因此,它无法看到OBJECT成员变量。

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

  

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

由于您(不幸)处理了一个接受函数指针的函数(CreateThread),因此您甚至无法使用std::bind。但是,CreateThread允许您提供接受指针的函数(void,请参阅ThreadProc的原型)。

只需将指向object的指针作为CreateThread的第四个参数传递,然后让windowsFunction(void*)接收该指针。在windowsFunction()里面,它仍然是static或全局的(事实上,你根本不需要calls_object类),你可以将指针强制转换为指向{{1}的指针并在其上调用object


另请注意,您的班级call()正在泄漏内存,因为您忘记calls_objectdelete的构造函数中创建的指针:

calls_object

答案 1 :(得分:1)

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