class Semaphore
{
private:
static sem_t sem_id;
}
在cpp:
sem_init(&Semaphore::sem_id, 0, 0);
显然,编译器不允许我在函数之外运行代码。但它不是一种只能初始化为某种值的类型。我该怎么做?
答案 0 :(得分:5)
你可以将sem_id
包装在你自己的类中,在默认构造中执行sem_init
(在销毁时执行sem_destroy
;不要忘记!)。
可悲的是,sem_t
不是一个类,所以你不能继承它,而必须改为组成它:
#include <semaphore.h>
class scoped_sem_t
{
public:
scoped_sem_t() { sem_init(&sem, 0, 0); }
~scoped_sem_t() { sem_destroy(&sem); }
sem_t& get() { return sem; }
private:
sem_t sem;
};
class Semaphore
{
private:
static scoped_sem_t impl; // use Semaphore::impl.get()
};
scoped_sem_t Semaphore::impl; // (don't forget this!)
(N.B。完全未经测试,但我想应该工作......)
(另外,不是类设计的最佳例子,但给出了要点。)
否则,遗憾的是,没有办法整齐地做到这一点。您可以在sem_init
的开头编写main
,但请注意不要从任何其他静态初始化程序引用Semaphore::sem_id
。
答案 1 :(得分:2)
只要在初始化程序中执行此操作,就可以从全局范围调用函数:
int unused_garbage = sem_init(&Semaphore::sem_id, 0, 0);
对于干净的破坏,您可以使用全局初始值设定项来注册at_exit处理程序,或者使用正确的RAII作为LRiO的答案演示。