C++ 错误 : invalid use of member 'calls_object::OBJECT' in static member function

标签 c++ windows multithreading function static

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

错误:在静态成员函数中无效使用成员“calls_object::OBJECT”| 错误:从这个位置

来自 OBJECT->call(); 第 29 行。

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

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

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

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;

}

最佳答案

这个函数:

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

声明为static。这意味着它不接收隐式 this 指针:换句话说,它不对 calls_object实例 进行操作。因此,它看不到 OBJECT 成员变量。

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

Basically the function must be static because its really a simplified version of the code which creates a windows thread

由于您(不幸的是)处理接受函数指针的函数 (CreateThread),您甚至不能使用 std::bind。但是,CreateThread 允许您提供接受指针的函数(指向 void,请参阅 ThreadProc 的原型(prototype))。

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


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

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

关于C++ 错误 : invalid use of member 'calls_object::OBJECT' in static member function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15186384/

相关文章:

c - 像在 Linux 上一样在命令行中显示实际错误

Windows PaintDesktop版本

linux - 当线程堆栈使用的内存被释放时

java - 如何从 Java 中的另一个线程更新 SWT GUI

c++ - 为什么 Arduino Micro(USB 设备)的供应商 ID 和产品 ID 在 Linux 和 Windows 中不同?

java - 如何设置用户输入的时间限制?

c++ - Fortran 子例程在链接到 C++ 程序时产生 "Undefined symbols"错误

c++ - 最佳实践 : How to improve this code that sums container values?

c++ - 将 char * 转换为 wchar_t *

c++ - boost::fusion::push_back 的正确用法是什么?