Как запретить повторное использование конструктора?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Закрыто
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Уж хотябы

Код: Выделить всё

class singleton
{
 private:
  singleton()
  {

  }
 public:
  static singleton object;
  int x;
};
singleton singleton: :o bject;
тогда, раз Вы вместо объектов считаете их имена.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А вот это:

Код: Выделить всё

class A
{
 public:
  A()
  {
   static bool flag=false;
   if (flag)
   {
    throw;
   }
   flag=true;
  }
  int x;
};
может показаться сингилтоном, но лишь пока в проекте нет обработки исключений.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

В классе, который мне нужен, все объекты должны не быть членами.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Оксалайя
Сообщения: 27
Зарегистрирован: 01 сен 2015, 12:12

Сионист писал(а):По Вашей же логике объекта здесь нет вообще.

Аргументируйте, что ли. Если можете, конечно.
Сионист писал(а):А вот это:

Код: Выделить всё

class A
{
 public:
  A()
  {
   static bool flag=false;
   if (flag)
   {
    throw;
   }
   flag=true;
  }
  int x;
};
может показаться сингилтоном, но лишь пока в проекте нет обработки исключений.

ЭТО может показаться синглтоном только Вам :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):По-Вашему сингилтон - лично моё изобретение в рамках конкретного проекта?
Нет, по-моему ты просто не знаешь, как он должен выглядеть на нормальном языке. Изобрести язык для того, чтобы там синглтон поддерживался одной строкой может каждый дурак, а написать его правильно на том языке, на котором ты сейчас пишешь свой проект - это уже несколько более сложная и квалифицированная работа.

Кстати, ты откуда узнал о синглтоне? Просто слышал где-то? Я сомневаюсь, что ты прочёл GOF'а, где он подробно описан, иначе бы таких глупостей не писал.
Сионист писал(а):По Вашей же логике объекта здесь нет вообще.
Неверно. Объект есть. И он один. На этот единственный объект указывает указатель m_pSingle.
Сионист писал(а):

Код: Выделить всё

class singleton
{
 private:
  singleton()
  {

  }
 public:
  static singleton object]
[/quote]
Господи, ты хоть пробовал откомпилировать то, что прислал? Налицо полное непонимание принципов работы комилятора С++. Внутри класса могут быть только ссылки или указатели на самого себя. Объяснять почему?

[quote="Сионист"]тогда, раз Вы вместо объектов считаете их имена.[/quote]
Я считаю не имена, а именно объекты. Более того, я использую общепринятую терминологию, а не выдумываю слова на ходу. Можешь сказать, что в твоём понимании "имена объектов"? Ссылку на термин в студию.

[quote="Сионист"]
[code=cpp]
class A
{
 public:
  A()
  {
   static bool flag=false]
[/quote] 
No comments.

[quote="Сионист"]В классе, который мне нужен, все объекты должны не быть членами.[/quote] 
Марсианский язык какой-то... Вот поэтому тебя очень тяжело понимать, так как ты пишешь те слова, которые тебе кажутся самому правильными, а не используешь общепринятую терминологию. Если я попытаюсь это представить по канонам использованных терминов, то получится, что ты говоришь, что у тебя не должно быть вот такой ситуации:
[code=cpp]
class A
{
A m_a1]
Но такая ситация и так невозможна с точки зрения компилятора.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Я считаю не имена, а именно объекты. Более того, я использую общепринятую терминологию, а не выдумываю слова на ходу. Можешь сказать, что в твоём понимании "имена объектов"? Ссылку на термин в студию.
Ну идентификатор же.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Ну идентификатор же.
Ага, теперь прояснилось. Нет, я считал как раз объекты. Кусочки памяти, в которых расположены данные. В моём случае объект создаётся ровно один и на него указывает m_pSingle. Статическая же функция GetInstance создаёт наш единственный объект, если он ещё не создан и возвращает указатель на него. За счёт того, что конструктор закрыт, вызывающий код сможет получить доступ к единственному объекту только через GetInstance, благодаря чему и достигается единственность.

Кстати, спорить с такой имплементацией бессмысленно. Даже на википедии она такая же, с точностью до переобозначений.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Нет, по-моему ты просто не знаешь, как он должен выглядеть на нормальном языке. Изобрести язык для того, чтобы там синглтон поддерживался одной строкой может каждый дурак
Вот именно. И это будет всё тот же синглтон. Если же изобрести язык, в котором оператором множественного ветвления будет слово branches, то там это будет уже не switch. В этом различие между паттерном и языковой конструкцией: switch со скобками двух видов, переменной/выражением и списком ветвей, каждая со своим case - языковая конструкция конкретного языка и оно пишется только в соответствии со стандартами именно этого языка, а синглтон - паттерн, имеющий смысл во всём ООП, означающий класс, гарантирующий единственность своего экземпляра, но из этой семантики не следует одна реализация, просто выбор языка диктует, что оптимальной именно на этом языке будет такая то реализация, но есть другие языки, где сингилтон пишется иначе. Нельзя сравнивать, как пишется switch на c++ и на object pascal, так как на object pascal вообще нет switch, а вместо него case of. А написание синглтона на c++ и object pascal сравнивать можно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ладно, Бог с ним с синглтоном. Расскажи более подробно, что за объекты и что за отношения между ними должны быть установлены. Я смогу предложить работающую, не избыточную, расширяемую и т.д. архитектуру, которая должна быть в коммерческом коде. Если согласишься с ней, то забирай и используй на здоровье. Если же не согласишься, то что уж поделаешь, пили по-своему, пытаясь наложить ограничение на единственный вызов конструктора :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Вот именно. И это будет всё тот же синглтон. Если же изобрести язык, в котором оператором множественного ветвления будет слово branches, то там это будет уже не switch. В этом различие между паттерном и языковой конструкцией: switch со скобками двух видов, переменной/выражением и списком ветвей, каждая со своим case - языковая конструкция конкретного языка и оно пишется только в соответствии со стандартами именно этого языка, а синглтон - паттерн, имеющий смысл во всём ООП, означающий класс, гарантирующий единственность своего экземпляра, но из этой семантики не следует одна реализация, просто выбор языка диктует, что оптимальной именно на этом языке будет такая то реализация, но есть другие языки, где сингилтон пишется иначе. Нельзя сравнивать, как пишется switch на c++ и на object pascal, так как на object pascal вообще нет switch, а вместо него case of. А написание синглтона на c++ и object pascal сравнивать можно.
Да хватит уже воду лить о других языках. Ты же проект на С++ пишешь. Ты хочешь в свой проект вставить синглтон на другом языке? Вот флуд и ничего более.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Закрыто