Singleton руками
От: agg  
Дата: 25.05.09 09:50
Оценка:
Здравствуйте, встала задача написать Singleton для iPhone, посмотрел иходник из Loki и вот что получилось:

template<class T, template <class> class CreationPolicy = CreateUsingNew> class Singleton 
{
    typedef T ObjectType;
public:
    static T& Instance();
protected:
Singleton(){}
private:
    static Singleton* _instance;
};


Все отлично кроме строки инициализации указателя. Реализация находится в том же заголовке вот строка на которую ругается компилятор(GCC 4.0):

Singleton* Singleton::_instance=0; //error: expected constructor, destructor, or type conversion before '*' token

пробовал разжевать ему:

template<class T, template <class> class C>Singleton* Singleton<T, C>::_instance=0;


Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?
Re: Singleton руками
От: tonykent  
Дата: 25.05.09 10:03
Оценка: +1
agg>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?


template<class T, template <typename T> class CreationPolicy = CreateUsingNew> 
class Singleton 
{
    typedef typename T ObjectType;
public:
    static T& Instance();
protected:
    Singleton(){}
private:
    static Singleton<T,CreationPolicy>* _instance;
};

template <class T,template <typename T> class CreationPolicy>
Singleton<T,CreationPolicy>* Singleton<T,CreationPolicy>::_instance;
Re[2]: Singleton руками
От: agg  
Дата: 25.05.09 10:09
Оценка:
Здравствуйте, tonykent, Вы писали:

agg>>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?



T>
T>template<class T, template <typename T> class CreationPolicy = CreateUsingNew> 
T>class Singleton 
T>{
T>    typedef typename T ObjectType;
T>public:
T>    static T& Instance();
T>protected:
T>    Singleton(){}
T>private:
T>    static Singleton<T,CreationPolicy>* _instance;
T>};

T>template <class T,template <typename T> class CreationPolicy>
T>Singleton<T,CreationPolicy>* Singleton<T,CreationPolicy>::_instance;
T>


То есть его явно что ли ненужно писать что равно 0?
Re[3]: Singleton руками
От: tonykent  
Дата: 25.05.09 10:13
Оценка:
Здравствуйте, agg, Вы писали:

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


agg>>>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?



T>>
T>>template<class T, template <typename T> class CreationPolicy = CreateUsingNew> 
T>>class Singleton 
T>>{
T>>    typedef typename T ObjectType;
T>>public:
T>>    static T& Instance();
T>>protected:
T>>    Singleton(){}
T>>private:
T>>    static Singleton<T,CreationPolicy>* _instance;
T>>};

T>>template <class T,template <typename T> class CreationPolicy>
T>>Singleton<T,CreationPolicy>* Singleton<T,CreationPolicy>::_instance;
T>>


agg>То есть его явно что ли ненужно писать что равно 0?


Надо. Я забыл. я тебе просто показал, в чем были проблемы.
Re[4]: Singleton руками
От: agg  
Дата: 25.05.09 10:15
Оценка:
Здравствуйте, tonykent, Вы писали:

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


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


agg>>>>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?



T>>>
T>>>template<class T, template <typename T> class CreationPolicy = CreateUsingNew> 
T>>>class Singleton 
T>>>{
T>>>    typedef typename T ObjectType;
T>>>public:
T>>>    static T& Instance();
T>>>protected:
T>>>    Singleton(){}
T>>>private:
T>>>    static Singleton<T,CreationPolicy>* _instance;
T>>>};

T>>>template <class T,template <typename T> class CreationPolicy>
T>>>Singleton<T,CreationPolicy>* Singleton<T,CreationPolicy>::_instance;
T>>>


agg>>То есть его явно что ли ненужно писать что равно 0?


T>Надо. Я забыл. я тебе просто показал, в чем были проблемы.

Спасибо большое я уже понял что специализацю одну ненаписал
Re[3]: Singleton руками
От: byleas  
Дата: 25.05.09 10:26
Оценка: +1
Здравствуйте, agg, Вы писали:

agg>То есть его явно что ли ненужно писать что равно 0?

Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
Re[4]: Singleton руками
От: tonykent  
Дата: 25.05.09 10:28
Оценка: -1
agg>>То есть его явно что ли ненужно писать что равно 0?
B>Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
Только не поинтеры.
Re: Singleton руками
От: Кодт Россия  
Дата: 25.05.09 10:32
Оценка:
Здравствуйте, agg, Вы писали:

Ты был всего в одном шаге от победы.
template<class T, template<class>class C>
Singleton<T,C>* Singleton<T,C>::_instance = 0;
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[4]: Singleton руками
От: tonykent  
Дата: 25.05.09 10:34
Оценка:
Здравствуйте, byleas, Вы писали:

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


agg>>То есть его явно что ли ненужно писать что равно 0?

B>Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.
Re[5]: Singleton руками
От: pavel.yurchenko Украина  
Дата: 25.05.09 10:43
Оценка:
Здравствуйте, tonykent, Вы писали:

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


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


agg>>>То есть его явно что ли ненужно писать что равно 0?

B>>Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
T>Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.

в debug или в release?
Re[6]: Singleton руками
От: tonykent  
Дата: 25.05.09 10:45
Оценка:
T>>Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.

PY>в debug или в release?

И там, и там. Но даже если это и позволяется стандартом — я всё-равно буду явно инициализировать.
Re: offtopic
От: ilvi Россия  
Дата: 25.05.09 12:08
Оценка:
Здравствуйте, agg, Вы писали:

agg>Здравствуйте, встала задача написать Singleton для iPhone, посмотрел иходник из Loki и вот что получилось:


для ифона уже можно писать на c++?
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re: Singleton руками
От: agg  
Дата: 25.05.09 12:26
Оценка:
Ну раз развелась такая дискуссия то новый вопрос. В этом классе подразумеваются стратегии создания/удаления, на данный момент у меня их 2, ни буду выдумывать что я супер гений который их придумал я их тупо скопировал из Loki, ну чуток подпилил их выглядят они вот так:
1) в куче

template <class T> struct CreateUsingNew
{
    static T* Create()
    { return new T; }
    
    static void Destroy(T* p)
    { delete p; }
};

в куче все хорошо на первый взгляд.

2) в стэке

template <class T> struct CreateStatic
{
    union MaxAlign
    {
        char t_[sizeof(T)];
        short int shortInt_;
        int int_;
        long int longInt_;
        float float_;
        double double_;
        long double longDouble_;
        struct Test;
        int Test::* pMember_;
        int (Test::*pMemberFn_)(int);
    };
    static T* Create()
    {
        static MaxAlign staticMemory_;
        return new(&staticMemory_) T; //error: no matching function for call to 'operator new(long unsigned int, CreateStatic<A>::MaxAlign*)'
    }
    
    static void Destroy(T* p)
    {
        p->~T();
    }
};

прием для стэка на основе сегмента статической памяти.

В общем в строке с размещающем new компилятор говорит что нет соответствующей функции для вызова, пытаюсь понять это особенность моего затупления или все таки для iPhone OS так писать нельзя, подскажите кто знает?
Re[2]: offtopic
От: agg  
Дата: 25.05.09 12:51
Оценка: 1 (1)
Здравствуйте, ilvi, Вы писали:

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


agg>>Здравствуйте, встала задача написать Singleton для iPhone, посмотрел иходник из Loki и вот что получилось:


I>для ифона уже можно писать на c++?

Там получается таким образом, все что касается работы с классами платформы iPhone нужно писать на Objective C, если хочешь в Objective C использовать C++ классы, то файлам реализации ставишь расширение mm( namefile.mm ), C++ классы пишешь так же, только в коде Objective C при включении желательно использовать #import а не #include. Нужно это для того чтобы все побыстрее шевелилось, переведя просто из Objective C на C++ движок который обсчитывает всякую геометрию и трансформации координат получился реальный прирост скорости, что аж пришлось замедлять в некоторых местах
Re[2]: Singleton руками
От: Аноним  
Дата: 25.05.09 13:34
Оценка:
Здравствуйте, agg, Вы писали:

agg>2) в стэке


встречный вопрос, а почему не подходит более простой вариант?

template <class T> struct CreateStatic
{
    static T* Create()
    {
        static T instance;
        t = &instance;
        return t;
    }
    
    static void Destroy(T* p)
    {
        assert(p == t);
        t->~T();
    }
private:
    static T* t = 0;
};
Re[5]: Singleton руками
От: byleas  
Дата: 25.05.09 14:52
Оценка: +1
Здравствуйте, tonykent, Вы писали:

T>Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.

В винде и будут, загрузчик зануляет неинициализированные данные. Но вроде встречал и в стандарте о статических данных.
Re[3]: offtopic
От: ilvi Россия  
Дата: 25.05.09 15:19
Оценка:
Здравствуйте, agg, Вы писали:
agg>Там получается таким образом, все что касается работы с классами платформы iPhone нужно писать на Objective C, если хочешь в Objective C использовать C++ классы, то файлам реализации ставишь расширение mm( namefile.mm ), C++ классы пишешь так же, только в коде Objective C при включении желательно использовать #import а не #include. Нужно это для того чтобы все побыстрее шевелилось, переведя просто из Objective C на C++ движок который обсчитывает всякую геометрию и трансформации координат получился реальный прирост скорости, что аж пришлось замедлять в некоторых местах

Круто. Даже это уже хорошо. Я просто думал, что при отсутствии желания писать на Object C остается возможноссть писать только на голом Си. В аппле сторе с таким си++ вставками тоже принимают?
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re[4]: offtopic
От: Аноним  
Дата: 25.05.09 18:11
Оценка:
Здравствуйте, ilvi, Вы писали:
I>Круто. Даже это уже хорошо. Я просто думал, что при отсутствии желания писать на Object C остается возможноссть писать только на голом Си. В аппле сторе с таким си++ вставками тоже принимают?

Я пишу заказчикам, как они это делают я без понятия , но они довольны, наверно пускают. Кстати может быть если вам не трудно вы скинете ссылочку, в которой детально описывается процесс как размещать в эппл стори свои программы?
Re[5]: offtopic
От: ilvi Россия  
Дата: 26.05.09 01:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Я пишу заказчикам, как они это делают я без понятия , но они довольны, наверно пускают. Кстати может быть если вам не трудно вы скинете ссылочку, в которой детально описывается процесс как размещать в эппл стори свои программы?


Сам пока этим не занимался. Друзья размещали. После получения лицензии, что является отдельным квестом, они отправляли исходники в апл. Те их просматривают и говорят либо что-то переделать, либо берут сразу, либо дают отказ.
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re[3]: Singleton руками
От: Аноним  
Дата: 26.05.09 04:44
Оценка:
Здравствуйте, Аноним, Вы писали:

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


agg>>2) в стэке


А>встречный вопрос, а почему не подходит более простой вариант?


А>
А>template <class T> struct CreateStatic
А>{
А>    static T* Create()
А>    {
А>        static T instance;
А>        t = &instance;
А>        return t;
А>    }
    
А>    static void Destroy(T* p)
А>    {
А>        assert(p == t);
        t->>~T();
А>    }
А>private:
А>    static T* t = 0;
А>};
А>

Мне тоже приходила в голову такая мысль, но почему-то взял второй вариант, только у вас там небольшая ошибочка, а вот так правильно как мне кажется будет:
template <class T> struct CreateStatic
{
    static T* Create()
    {
        static T instance;
        t = &instance;
        return t;
    }
    
    static void Destroy(T* p)
    {
        assert(p == t);
        t->~T();
    }
private:
    static T* t;
};

template<class T>T* CreateStatic<T>::t=0;


Как заработает исходник в эту ветку выложу.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.