0

古い C++ プロジェクトを Linux (RHEL 5.3) に移植しています。

状況は次のとおりです

#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;OldClass をラップするクラス MySem_t を作成して 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_tsem_t

私はコードについて何も知らないので、それ以上あなたを導くことはできませんが、それはおそらくあなたの最高の攻撃ベクトルです。

于 2010-06-28T18:51:31.133 に答える
1

ここでの継承の目的は正確には何ですか?メソッド構文のシンタックスシュガー(.Netの拡張メソッドを考えてください)の直後であれば、おそらく無料の関数を使用する必要があります。

実際に別のクラスが必要な場合は、継承よりもコンポジションを優先する必要があります。つまり、メンバーではなく、メンバーOldClass必要です。sem_tsem_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 に答える