Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание объекта, не более одного 
:(
    Опции темы
Paradox
Дата 2.3.2004, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Как в программе можно описать класс, так что объектов этого класаа, созданных в программе будет не более одного, т.е. если один уже есть то остальные невозможно создать даже по ошибке или преднамеренно


--------------------
---
PM MAIL WWW   Вверх
srd
Дата 2.3.2004, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Статический член-данное в качестве счетчика или указателя на созданный объект тебе поможет.

Код

class A {
public:
   A(void);
private:
   static bool the_only;
};


bool A::the_only = false;

A::A(void)
{
   assert(!the_only);
  the_only = true;
}





--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Borisff2003
Дата 2.3.2004, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 26.2.2004
Где: г. Уфа

Репутация: 1
Всего: 1



Поищи в сети информацию по паттерну одиночка(Singleton). И вообще советую приобрести книгу "Приемы объектно-ориентированного проектирования. Паттерны проектирования" Э. Гамма и др.

А самая простая но не лишеннаяя недостатков реализация

class Singleton{
public:
static Singleton* Intance();
protected:
Singleton();
private:
static Singleton * _instance;
};

Singleton* Singleton::_instance = 0;

Singleton* Singleton::Instance(){
if(_instance==0){
_instance=new Singleton;
}
return _instance;
};


--------------------
Лень, двигатель прогресса
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 3.3.2004, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



А разрушение его только с убиванием процесса. smile.gif Самое главное, чтобы никто delete для результата не вызвал. А есть ли тогда смысл создавать его динамически? Почему бы не сделать типа так:

Код

class Singleton
{
   friend Singleton& singleton();
private:
   static Singleton& Instance() {return _instance;};
   Singleton() {};
   static Singleton _instance;

public:
 <public члены>
};

Singleton Singleton::_instance = Singleton();

Singleton& singleton() {return Singleton::Instance();}






--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vyacheslav
Дата 4.3.2004, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Иногда имеет смысл создавать динамичиски, для того чтобы точно контролировать время создания объекта. В варианте Borisff2003, например, объект будет создан, тогда когда впервые будет использован. При этом уже предполагается, что для создание и использования объекта созданы все условия.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 4.3.2004, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Иногда имеет смысл создавать динамичиски, для того чтобы точно контролировать время создания объекта.


В этом случае я бы предложил вариант инициализации, вместо создания динамически. Почему-то не хочется мне синглтон создавать динамически, если без этого можно обойтись. И не хочеться, чтобы пользователь работал с указателем на синглтон. smile.gif


--------------------
Волны гасят ветер...
PM MAIL   Вверх
sergejzr
Дата 6.3.2004, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Так как без статистических переменных не обойтись, предлагаю исползовать функцию (не конструктор) для создания обьектов и статистический указатель на созданный обьект...
Код

/*
Как правильно будет подмечено Fantasist'ом в следующем сообщении
-  bool cnt=0;
+ int    cnt=0;
*/

bool cnt=0;

Singleton* staticSingleton;
/**/
Singleton* createSingleton()
{
/*посчитать кол-во обьектов в программе для правильной деструкции
cnt++;
/*возвратить указатель на новый статический обьект, если его не существует. Иначе возвратить указатель на ранее
   созданный статический обьект
*/
return cnt==1 ? (staticSingleton=new Singleton()) : staticSingleton;
}

и соответственно деструктор
Код


void destroySingleton()
{

if(cnt==1)
{
  // последний обьект в программе - можно деструктировать
  delete staticSingleton;
}
else if(cnt>1) //не дай бог счётчик станет негативным :)
{
  //обьект ещё нужен
  cnt--;
}

}


для красоты можно запаковать это всё в класс для "раздачи" обьектов.

PS: я так понял, что обьект всегда остаётся одним и тем же. Иначе можно конечно вернуть ноль, но тогда надо будет каждый раз проверять, а в таком случае можно было бы и статическую переменную класса опрашивать.
а assert это конечно хорошо, только пользователю от них плохо становится.

Это сообщение отредактировал(а) sergej.z - 10.3.2004, 02:03


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Fantasist
Дата 7.3.2004, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



sergej.z а предыдущие ответы читать пробывали? smile.gif


--------------------
Волны гасят ветер...
PM MAIL   Вверх
sergejzr
Дата 7.3.2004, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(Fantasist @ 7.3.2004, 01:01)
sergej.z  а предыдущие ответы читать пробывали? smile.gif

В принципе все правы и все ответы примерно одно и тоже smile.gif. Но в этом варианте нет проблем с деструкцией, что является основным при работе со статическими обьектами.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Fantasist
Дата 8.3.2004, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Но в этом варианте нет проблем с деструкцией....



Зато есть проблемы с логикой. Во-первых, называть функции create... и destroy... , которые в большинстве случаев ничего не создают и ничего не разрушают не очень понятно. Во-вторых, маловероятно понадобиться singleton, который постоянно создается и разрушается: чаще всего подразумевается один единственный экземпляр объекта, который существует непрерывно на всем промежутке его использования. В-третьих, совершенно не понятно зачем счетчик, если он никогда не будет иметь значения выше 1. Или 2? Так как в коде присутствует ошибка, непонятно, что задумывалось: то ли 1 и 2, то ли 0 и 1, то ли true и false. В-четвертых, непонятно в какой момент вызывать destroySingleton(). То ли каждый раз, после того как вызвали createSingleton(), что громозко и не удобно, то ли где-то в конце работы, тогда непонятно где.


Цитата
...что является основным при работе со статическими обьектами


Весьма спорное утверждение. Его вполне можно оставить существовать до конца работы программы и неубивать вообще, хоть это и не очень красиво, если память выделяется динамически. В моем варианте проблема освобождения памяти отсутсвует вообще.



--------------------
Волны гасят ветер...
PM MAIL   Вверх
FreshMeat
Дата 9.3.2004, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 30.1.2004

Репутация: нет
Всего: нет



А. Александреску "Современное проектирование на С++"
Глава 6. Реализация шаблона Singleton.
PM MAIL   Вверх
sergejzr
Дата 9.3.2004, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



To Fantasist:
Цитата

  ... функции create... и destroy... , которые в большинстве случаев ничего не создают и ничего не разрушают...
 

А откуда юзеру знать? Он вызовет етy функцию каждый раз, когда Синглтон будет нужен (Представте многопоточное приложение).
Цитата

  ... если он никогда не будет иметь значения выше 1. Или 2...
 

кто его знает сколько раз юзер захочет Синглтон?
Цитата

Так как в коде присутствует ошибка...

Не пробовал компилирировать sad.gif. Извиняюсь за ошибку (исправил буль на интегер ).

To FreshMeat
Спасибо! очень интересная ссылка. статический класс без конструктора - (IMHO) действительно в 90% лучшее решение
( из JAVA однако).

PS: я всё равно за динамику потому что неизвестно будет ли вообше нужно создание обьекта этого класса.




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.