我在Linux上移植了一些旧的C ++项目(RHEL 5.3)。
情况如下
#include <semaphore.h>
class OldClass: public sem_t
这曾经有效,因为直到glibc-2.3.3.20040420 sem_t是一个结构。 现在,使用较新版本的glib是不允许的union =&gt;继承。所以汇编不起作用。
它是怎么回事:
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 ...这听起来可行吗?
谢谢。
答案 0 :(得分:4)
您必须创建类型为sem_t的类成员。为了简化移植,您可以使用类似的类型转换方法:
class MyClass {
private:
sem_t _sem;
public:
operator sem_t&() { return _sem; }
operator const sem_t&() const { return _sem; }
// etc
}
答案 1 :(得分:1)
从来没有打算从sem_t
继承,所以如果他们选择继承而不是存储单独的信号量,那么您移植的代码会有一些问题。
我建议您进行一些分析和重构,使OldClass
不从sem_t
继承,而使用<,而不是试图复制旧代码解决问题的方式。 / em> a sem_t
必要时。
我对代码一无所知所以我不能指引你进一步,但这可能是你最好的攻击向量。
答案 2 :(得分:1)
这里继承的目的究竟是什么?如果你刚刚使用了方法语法的语法糖(想想.Net中的扩展方法),那么你应该只使用自由函数。
如果你确实需要单独的类,那么你应该支持组合而不是继承。即OldClass
{em>拥有 sem_t
成员,而不是 sem_t
。
答案 3 :(得分:0)
使用OldClass定义,并使用具有sem_t的OldClass重写它。尽管您希望编译定义本身,但不要担心它是一个很好的重写。现在,尝试重新编译。为级联的错误消息做好准备,因为代码可能是使用OldClass作为一个简单的结构。仔细阅读大量错误消息。
如果你很幸运,不是很多代码直接与sem_t成员混淆,因为你必须改变这些行中的每一行。 (无论如何,你都不得不改变它们,因为sem_t从根本上改变了。)不幸的是,认为从sem_t继承的好主意的程序员可能不认为有必要将sem_t视为不透明的数据类型,作为一个整体使用,除了某些功能。