0

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

情况如下

#include <semaphore.h>

class OldClass: public sem_t

这曾经有效,因为直到 glibc-2.3.3.20040420 sem_t 是一个结构。现在,新版本的 glib 不允许使用 union =>inheritance。所以编译不起作用。

它怎么样:

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

4 回答 4

4

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

class MyClass {
  private:
    sem_t _sem;
  public:
    operator sem_t&() { return _sem; }
    operator const sem_t&() const { return _sem; }
// etc
}
于 2010-06-28T18:54:49.483 回答
1

继承自sem_t从未打算

与其尝试复制旧代码解决问题的方式,我建议您进行一些分析和重构,以便OldClass不继承自sem_t,但在必要时使用a 。sem_t

我对代码一无所知,因此无法进一步指导您,但这可能是您最好的攻击媒介。

于 2010-06-28T18:51:31.133 回答
1

这里继承的目的到底是什么?如果您只是在使用方法语法的语法糖(想想 .Net 中的扩展方法),那么您可能应该只使用自由函数。

如果您确实需要单独的类,那么您应该更喜欢组合而不是继承。即OldClass应该一个sem_t成员,而不是一个sem_t.

于 2010-06-28T18:51:57.103 回答
0

取定义 OldClass,并重写它,OldClass 有一个 sem_t。不要担心它是一个很好的重写,尽管您希望定义本身能够编译。现在,尝试重新编译。为错误消息的级联做好准备,因为代码很可能使用 OldClass 作为一个简单的结构。浏览大量错误消息。

如果幸运的话,不会有很多代码直接与 sem_t 成员混淆,因为您必须更改每一行。(无论如何,您都必须更改它们,即使没有不合理的继承,因为 sem_t 从根本上改变了。)不幸的是,认为从 sem_t 继承是个好主意的程序员可能认为没有必要将 sem_t 视为不透明数据类型,作为一个整体使用,除了某些功能。

于 2010-06-28T19:21:38.280 回答