проблема со статическими переменными в шаблонах
От: _niko_ Россия  
Дата: 24.06.11 05:23
Оценка:
Ситуация такая:
— есть шаблонный класс в рамках которого существует статическая переменная (счетчик);
— есть несколько отдельно собираемых модулей (статическую и динамическую линковку можно рассмотреть отдельно) которые используют данный класс.

Проблема в следующем (ни к компилятору ни к кому другому претензий не имею — все логично ):
При создании в этих модулях экземпляров этого класса проблемная статическая переменная инстанциируется для каждого модуля своя и общего счетчика не получается.

Собственно чего хочется:
Каким нибудь макаром все же иметь общий счетчик.

Пожелания:
— хочу обойтись только наличием *.h файла (без вынесения реализации в *.cpp);
— при возможности не задействовать boost (это если у него там на этот счет что то есть );
— решение должно быть кросс-платформенным.

Нижепривиденный код более конкретно демонстрирует ситуацию (код критиковать не обязательно — ибо написан только чтоб отразить проблему):
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 :(
Re: проблема со статическими переменными в шаблонах
От: Vain Россия google.ru
Дата: 24.06.11 08:35
Оценка:
Здравствуйте, _niko_, Вы писали:

__>Ситуация такая:

__>Пожелания:
__> — хочу обойтись только наличием *.h файла (без вынесения реализации в *.cpp);
__> — при возможности не задействовать boost (это если у него там на этот счет что то есть );
__> — решение должно быть кросс-платформенным.
Что мешает вынести статическую переменную в нешаблонную глобальную функцию и вызвать её в конструкторе своих менеджеров?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: проблема со статическими переменными в шаблонах
От: ilnar Россия  
Дата: 24.06.11 08:55
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, _niko_, Вы писали:


__>>Ситуация такая:

__>>Пожелания:
__>> — хочу обойтись только наличием *.h файла (без вынесения реализации в *.cpp);
__>> — при возможности не задействовать boost (это если у него там на этот счет что то есть );
__>> — решение должно быть кросс-платформенным.
V>Что мешает вынести статическую переменную в нешаблонную глобальную функцию и вызвать её в конструкторе своих менеджеров?
може, желание сделать отдельные статические переменные для каждого инстанцируемого типа?
Re: проблема со статическими переменными в шаблонах
От: GhostCoders Россия  
Дата: 24.06.11 09:46
Оценка:
мне тоже интересно решение, кроме как использовать функции и передавать указатель на общую переменную идей нет.

на GCC (Linux, по крайней мере) обе статические переменные сольются в одну, и код будет работать.
Третий Рим должен пасть!
Re[2]: проблема со статическими переменными в шаблонах
От: _niko_ Россия  
Дата: 24.06.11 12:01
Оценка:
Здравствуйте, Vain, Вы писали:

V>Что мешает вынести статическую переменную в нешаблонную глобальную функцию и вызвать её в конструкторе своих менеджеров?


Как правильно заметил ilnar: желание сделать отдельные статические переменные для каждого инстанцируемого типа, да даже если отказаться от шаблона то все равно предложенный вариант не прокатывает.

Вопрос у меня изначально родился при использовании динамической линковки. Решил попробовать статическую: оказалось что ничего придумывать и не нада — все и так работает в "базовом" варианте.

Вопрос остается открытым для динамической линковки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.