sem_t union / struct C ++继承

时间:2010-06-28 18:45:21

标签: c++ struct semaphore glibc unions

我在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 ...这听起来可行吗?

谢谢。

4 个答案:

答案 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视为不透明的数据类型,作为一个整体使用,除了某些功能。