Здравствуйте, встала задача написать 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;
Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?
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;
Здравствуйте, tonykent, Вы писали:
agg>>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?
Здравствуйте, agg, Вы писали:
agg>Здравствуйте, tonykent, Вы писали:
agg>>>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?
Здравствуйте, tonykent, Вы писали:
T>Здравствуйте, agg, Вы писали:
agg>>Здравствуйте, tonykent, Вы писали:
agg>>>>Но никакие финты не помогли, такое предчувствие что я переработал и немного затупил, подскажите пожалуйста как правильно занулить статический указатель?
agg>>То есть его явно что ли ненужно писать что равно 0?
T>Надо. Я забыл. я тебе просто показал, в чем были проблемы.
Спасибо большое я уже понял что специализацю одну ненаписал
Здравствуйте, agg, Вы писали:
agg>То есть его явно что ли ненужно писать что равно 0?
Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
agg>>То есть его явно что ли ненужно писать что равно 0? B>Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
Только не поинтеры.
Здравствуйте, byleas, Вы писали:
B>Здравствуйте, agg, Вы писали:
agg>>То есть его явно что ли ненужно писать что равно 0? B>Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет?
Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.
Здравствуйте, tonykent, Вы писали:
T>Здравствуйте, byleas, Вы писали:
B>>Здравствуйте, agg, Вы писали:
agg>>>То есть его явно что ли ненужно писать что равно 0? B>>Вроде бы в С++ статические фундаментальные типы инициализируются нулями—нет? T>Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.
T>>Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.
PY>в debug или в release?
И там, и там. Но даже если это и позволяется стандартом — я всё-равно буду явно инициализировать.
Ну раз развелась такая дискуссия то новый вопрос. В этом классе подразумеваются стратегии создания/удаления, на данный момент у меня их 2, ни буду выдумывать что я супер гений который их придумал я их тупо скопировал из Loki, ну чуток подпилил их выглядят они вот так:
1) в куче
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 так писать нельзя, подскажите кто знает?
Здравствуйте, 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) в стэке
встречный вопрос, а почему не подходит более простой вариант?
Здравствуйте, tonykent, Вы писали:
T>Хм, проверил сейчас. И правда — поинтеры тоже на моей студии 2008. Интересно было бы в стандарт заглянуть.
В винде и будут, загрузчик зануляет неинициализированные данные. Но вроде встречал и в стандарте о статических данных.
Здравствуйте, 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 остается возможноссть писать только на голом Си. В аппле сторе с таким си++ вставками тоже принимают?
Я пишу заказчикам, как они это делают я без понятия , но они довольны, наверно пускают. Кстати может быть если вам не трудно вы скинете ссылочку, в которой детально описывается процесс как размещать в эппл стори свои программы?
Здравствуйте, <Аноним>, Вы писали:
А>Я пишу заказчикам, как они это делают я без понятия , но они довольны, наверно пускают. Кстати может быть если вам не трудно вы скинете ссылочку, в которой детально описывается процесс как размещать в эппл стори свои программы?
Сам пока этим не занимался. Друзья размещали. После получения лицензии, что является отдельным квестом, они отправляли исходники в апл. Те их просматривают и говорят либо что-то переделать, либо берут сразу, либо дают отказ.
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Re[3]: Singleton руками
От:
Аноним
Дата:
26.05.09 04:44
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, agg, Вы писали:
agg>>2) в стэке
А>встречный вопрос, а почему не подходит более простой вариант?
А>
Мне тоже приходила в голову такая мысль, но почему-то взял второй вариант, только у вас там небольшая ошибочка, а вот так правильно как мне кажется будет: