sem_t union / struct C ++ наследование - PullRequest
0 голосов
/ 28 июня 2010

Я портирую какой-то старый проект C ++ на Linux (RHEL 5.3).

Ситуация следующая

#include <semaphore.h>

class OldClass: public sem_t

Раньше это работало, потому что до glibc-2.3.3.20040420 sem_t был структурой. Теперь с более новой версией glib наследование union => не разрешено. поэтому компиляция не работает.

как это было:

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.

Я подумал, есть ли способ создать класс MySem_t, который обернут вокруг sem_t; тогда OldClass наследовал бы MySem_t ... это возможно?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 28 июня 2010

Вы должны создать члена класса с типом sem_t.Чтобы упростить портирование, вы можете использовать методы приведения типов, например:

class MyClass {
  private:
    sem_t _sem;
  public:
    operator sem_t&() { return _sem; }
    operator const sem_t&() const { return _sem; }
// etc
}
1 голос
/ 28 июня 2010

Какова цель наследования здесь? Если вам нужен синтаксический сахар синтаксиса методов (подумайте о методах расширения в .Net), то вам, вероятно, следует просто использовать бесплатные функции.

Если вам действительно нужен отдельный класс, то вам следует отдать предпочтение композиции, а не наследованию. То есть OldClass должен иметь a sem_t член, а не be a sem_t.

1 голос
/ 28 июня 2010

Наследование от sem_t никогда не предназначалось, поэтому у портируемого кода явно были некоторые проблемы, если они решили наследовать, а не хранить отдельный семафор.

Вместо того, чтобы пытаться дублировать способ, которым старый код подходит к проблеме, я бы посоветовал вам провести некоторый анализ и рефакторинг, чтобы OldClass не наследовал от sem_t, но использует a sem_t где необходимо.

Я ничего не знаю о коде, поэтому не могу направить вас дальше, но это, вероятно, ваш лучший вектор атаки.

0 голосов
/ 28 июня 2010

Возьмите определение OldClass и перепишите его, причем OldClass имеет sem_t.Не беспокойтесь, что это хорошая перезапись, хотя вы хотите, чтобы само определение компилировалось.Теперь попробуйте перекомпилировать.Будьте готовы к каскадам сообщений об ошибках, потому что вполне вероятно, что код использовал OldClass в качестве простой структуры.Пролистайте массу сообщений об ошибках.

Если вам повезет, не так уж много кода напрямую перепутано с членами sem_t, потому что вам придется изменить каждую из этих строк.(В любом случае вам пришлось бы изменить их, даже без неуместного наследования, поскольку sem_t кардинально изменился.) К сожалению, программисты, считавшие хорошей идеей наследовать от sem_t, скорее всего, не считали необходимым рассматривать sem_t как непрозрачные данные.тип, который будет использоваться в целом, за исключением определенных функций.

...