[英]sem_t union/struct C++ inherintance
我正在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
}
从sem_t
继承从来就不是故意的,因此,如果要移植的代码选择继承而不是存储单独的信号量,则显然会遇到一些问题。
而不是试图复制旧代码处理该问题的方式,我建议你做一些分析和重构,使得OldClass
不继承sem_t
,但使用的是sem_t
必要的地方。
我对代码一无所知,因此无法进一步指导您,但这可能是您最好的攻击手段。
这里继承的目的到底是什么? 如果您只是在使用方法语法的语法糖(例如.Net中的扩展方法),那么您可能应该只使用自由函数。
如果您确实需要单独的类,则应优先考虑使用组合而不是继承。 即OldClass
应该有一个sem_t
成员,而不是成为一个sem_t
。
取OldClass的定义,并重写它,让OldClass具有sem_t。 尽管您希望定义本身可以编译,但是不必担心它会被很好地重写。 现在,尝试重新编译。 为错误消息的级联做好准备,因为代码很可能使用OldClass作为简单结构。 浏览大量错误消息。
如果幸运的话,不会有很多代码直接与sem_t成员搞混,因为您将不得不更改每一行。 (由于sem_t发生了根本性的变化,即使没有隐含的继承,您也必须进行任何更改。)不幸的是,那些认为从sem_t继承是一个好主意的程序员可能认为没有必要将sem_t视为不透明的数据。类型,除了某些功能外,可以整体使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.