繁体   English   中英

sem_t union / struct C ++继承

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM