我从下面的代码中收到以下错误。
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;
}
答案 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_object
在delete
的构造函数中创建的指针:
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
。