我正在Linux(RHEL 5.3)上移植一些旧的C ++项目。

情况如下

#include <semaphore.h>

class OldClass: public sem_t


这一直有效,因为直到glibc-2.3.3.20040420 sem_t是一个结构。
现在,对于较新版本的glib,不允许联合=>继承。因此编译不起作用。

它怎么样:

typedef struct { struct
_pthread_fastlock __sem_lock;
int __sem_value;
_pthread_descr __sem_waiting; }
sem_t;


怎么样:

typedef union {
char __size[__SIZEOF_SEM_T];
long int __align; }
sem_t;


解决此问题的最佳方法是什么?如何“包装” sem_t的功能?

非常感谢!

======以后编辑====================================

OldClass是其他类(项目相当大)使用的“后期”:因此,我正在寻找一种方法来保持相同的接口,这样就可以避免重写所有对OldClass的调用。

我在想是否有办法创建环绕sem_t的MySem_t类; OldClass然后会继承MySem_t ...听起来可行吗?

谢谢。

最佳答案

您必须创建一个类型为sem_t的类成员。为了简化移植,可以使用如下的类型转换方法:

class MyClass {
  private:
    sem_t _sem;
  public:
    operator sem_t&() { return _sem; }
    operator const sem_t&() const { return _sem; }
// etc
}

10-08 13:30