Наследование от классов в общем объекте

Я хочу расширить C ++ namespace классов в разделяемом объекте Linux через наследование. Какие проблемы могут возникнуть, в частности, связанные со статическими объектами и данными-членами?

// as a crude example (note: untested code)
// compiled into libBase.so
namespace foo
{
class Cfoo
{
protected:
static double Pi; // defined outside header
public:
Cfoo () {}
double fooPi () { Pi *= Pi; return Pi; }
};
}

// compiled into libDerived.so
namespace foo
{
class Cbar : public Cfoo
{
double barPi () { Pi = sqrt(Pi); return Pi; }
};
}

Платформа: GCC 4.5 на RHEL 5.

2

Решение

Порядок инициализации (класс) глобальных статических переменных в разных единицах перевода не определено. Однако, если вы оборачиваете статическую переменную класса Pi в функцию-член, вы заменяете ее локальным статическим объектом. Действующий пункт C ++ 4: «Избегайте проблем порядка инициализации в единицах перевода путем замены нелокальных статических объектов локальными статическими объектами». Если объект остается глобально статичным, может случиться так, что он останется неинициализированным до того, как другой код будет его использовать.

protected:
static double PI()
{
static double PI = 3.141;
return PI;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]