Ситуация такая:
— есть шаблонный класс в рамках которого существует статическая переменная (счетчик);
— есть несколько отдельно собираемых модулей (статическую и динамическую линковку можно рассмотреть отдельно) которые используют данный класс.
Проблема в следующем (ни к компилятору ни к кому другому претензий не имею — все логично
![](/Forum/Images/smile.gif)
):
При создании в этих модулях экземпляров этого класса проблемная статическая переменная инстанциируется для каждого модуля своя и общего счетчика не получается.
Собственно чего хочется:
Каким нибудь макаром все же иметь общий счетчик.
Пожелания:
— хочу обойтись только наличием *.h файла (без вынесения реализации в *.cpp);
— при возможности не задействовать boost (это если у него там на этот счет что то есть
![](/Forum/Images/smile.gif)
);
— решение должно быть кросс-платформенным.
Нижепривиденный код более конкретно демонстрирует ситуацию (код критиковать не обязательно — ибо написан
только чтоб отразить проблему):
class Data
{
protected:
Data() {}
Data(const Data & ) { }
Data & operator=(const Data & ) { return *this; }
virtual ~Data() {}
};
template<class _Ty>
class DataManager
{
public:
typedef _Ty ValueType;
private:
class DataPrivate : public Data
{
public:
DataPrivate() {}
DataPrivate(const DataPrivate & ) { }
DataPrivate & operator=(DataPrivate & ) { return *this; }
virtual ~DataPrivate() {}
};
public:
static Data * createData()
{
return (++ms_counter, new DataPrivate);
}
static void deleteData(const Data * data)
{
delete (--ms_counter, static_cast<const DataPrivate*>(data));
}
static ValueType counter() { return ms_counter; }
private:
static ValueType ms_counter;
};
template<class _Ty> _Ty DataManager<_Ty>::ms_counter = _Ty();
typedef DataManager<int> DataManagerInt;
Сперва выполняется код из 1-о модуля
DataManagerInt dataManager1;
Data * data1 = dataManager1.createData();
DataManagerInt::ValueType counter1(dataManager1.counter()); // counter1 = 1
Далее выполняется код из 2-о модуля
DataManagerInt dataManager2;
Data * data2 = dataManager2.createData();
DataManagerInt::ValueType counter2(dataManager2.counter()); // counter1 = 1, а хотелось бы поиметь 2 :(
Здравствуйте, _niko_, Вы писали:
__>Ситуация такая:
__>Пожелания:
__> — хочу обойтись только наличием *.h файла (без вынесения реализации в *.cpp);
__> — при возможности не задействовать boost (это если у него там на этот счет что то есть
);
__> — решение должно быть кросс-платформенным.
Что мешает вынести статическую переменную в нешаблонную глобальную функцию и вызвать её в конструкторе своих менеджеров?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, _niko_, Вы писали:
__>>Ситуация такая:
__>>Пожелания:
__>> — хочу обойтись только наличием *.h файла (без вынесения реализации в *.cpp);
__>> — при возможности не задействовать boost (это если у него там на этот счет что то есть
);
__>> — решение должно быть кросс-платформенным.
V>Что мешает вынести статическую переменную в нешаблонную глобальную функцию и вызвать её в конструкторе своих менеджеров?
може, желание сделать отдельные статические переменные для каждого инстанцируемого типа?
мне тоже интересно решение, кроме как использовать функции и передавать указатель на общую переменную идей нет.
на GCC (Linux, по крайней мере) обе статические переменные сольются в одну, и код будет работать.