在类 Foo 中,我需要一个类成员,它是一个包含指向 Foo 对象的指针的结构 S。
Foo.h
Struct S{
...
Foo *ptrToFoo
}
class Foo{
Foo();
~Foo();
...
S sname;
};
现在这显然失败了,因为 sname 的定义包含一个指向它尚未看到的对象的指针。
我的解决方案是为 S 创建一个对象(在头文件中),然后使用前向声明:
嘘
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.
我对这部分的解决方案感到满意,只要对我上面的真正问题有一种不那么草率的方法。