0

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

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;

}
4

2 回答 2

2

这个功能:

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

被声明为static。这意味着它不会接收隐式指针:换句话说this,它不会对. 因此,它看不到成员变量。calls_objectOBJECT

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

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

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

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


另请注意,您的类calls_object正在泄漏内存,因为您忘记了在的构造函数delete中创建的指针:calls_object

~calls_object() 
{ 
    delete object; // DON'T FORGET THIS!
}
于 2013-03-03T13:56:09.567 回答
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

于 2013-03-03T13:56:11.057 回答