我正在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
}