c++ - 用于 pthreads 的对象定义中指向对象的指针的草率解决方案

标签 c++ struct header-files

在类 Foo 中,我需要一个类成员,它是一个包含指向 Foo 对象的指针的结构 S。

Foo.h

Struct S{
    ...
    Foo *ptrToFoo
}

class Foo{ 
    Foo();
    ~Foo();
    ...
    S sname;
};

现在这显然失败了,因为 sname 的定义包含一个指向它尚未见过的对象的指针。

我的解决方案是为 S 创建一个对象(在头文件中),然后使用前向声明:

S.h

class Foo;
class S{
    Foo *ptrtoFoo;
    ...
}

Foo.h

// can use S as an object as a data member in Foo

这对我来说真的很草率。 有更好的方法吗?S 不“保证”它自己的对象,因为它没有方法;一个结构就可以了。

现在,如果您不在乎原因而只想提供帮助,请跳过其余部分。如果您认为“这对我来说似乎是糟糕的设计!”,请继续阅读。

我这样做的原因是 pThreads_create 不将非静态类成员函数作为参数。常见的解决方案(正如许多 stackoverflow 帖子)指出的那样,是创建一个调用您想要的真实函数的静态成员函数,然后传递调用者对象,如下所示:

void *Foo::callerHelper(void *arg)
{
    //http://stackoverflow.com/questions/7820653/pthread-create-parameter-function-pointer
    //http://stackoverflow.com/questions/86046/best-way-to-start-a-thread-as-a-member-of-a-c-class
    Foo *ptr = (Foo *)(arg);
    ptr->RealFnctnToCall();
    return 0;
}

...
pthread_create(&threads[id], NULL, &Foo::callerHelper, this)

但是,我不仅需要传递这个参数,还需要传递其他参数。我的“S”对象代表参数有效载荷。它包含指向它的指针,以及我需要的“RealFnctnToCall”的真实参数

S package;
S.FooPtr = this;
S.intINeed = ...
... 
//recast S as (void *)

然后做

pthread_create(&threads[id], NULL, &Foo::callerHelper, S)
// in callerHelper, depackage S and get everything I want. 

我对这部分的解决方案很满意,只要有一个不那么草率的方法来解决我上面的真正问题。

最佳答案

直接在现有代码中转发声明 Foo 怎么样?这是规范的 C++ 实现方式。

class Foo;
Struct S{
    ...
    Foo *ptrToFoo;
};

class Foo{ 
    Foo();
    ~Foo();
    ...
    S sname;
};

关于c++ - 用于 pthreads 的对象定义中指向对象的指针的草率解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088083/

相关文章:

c++ - 来自图像的简单视频制作者

c - 什么是哈希表?如何在C语言中创建哈希表?

c++ - 在多个 Cpp 文件中使用一个变量

c++ - 静态库(obj 文件)之间共享的类的实例

c++ - 如何在 C++ 中使用时钟()

c++ - 如何正确实现C++流操纵器endl?

C(linux)传递结构数组以删除元素

c++ - CUDA 使用 cudaMemcpy 复制多个结构数组

c++ - 如何包含头文件

c++ - 无法编译 std::map 排序,为什么?