Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Можно ли создать глобальный обект, вызвав для него закрытый конструктор? - C++

24.02.2010, 07:39. Просмотров 1461. Ответов 8
Метки нет (Все метки)

Можно ли создать глобальный объект, вызвав для него закрытый конструктор? Как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2010, 07:39     Можно ли создать глобальный обект, вызвав для него закрытый конструктор?
Посмотрите здесь:

Закрытый копирующий конструктор - C++
В данном упражнении описана методика, которая может помочь отказаться от копирующих конструкторов. Создайте класс Х и объявите (но не...

boost::make_shared и закрытый конструктор - Boost C++
Здравствуйте. Писал одну программку и получилась примерно такая схема class A { private: class B { ...

Можно ли создать класс, который при вызове деструктора учитывает количество ссылок на него - C++
Короче можно ли сделать класс как в C# или java, чтобы объект удолялся только когда на него никто не ссылается. Желательно варианты без...

Произведение элементов для каждого из данных массивов, вызвав соответствующую версию функции - C++
1)Определить функцию для нахождения произведения элементов массива целых чисел; 2)Перегрузите функцию для работы с вещественными...

Создать конструктор для массива, как члена класса - C++
Добрый день! Если одним из членов класса, является массив, какой конструктор может для него использоваться, как он выглядит?

как привильно создать и вызвать конструктор для массив обьектов - C++
Сам класс class Planet{ public: string name; protected: double diameter; private: int sputniks, number, distance; public: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 08:59     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #2
taras atavin, смотри в сторону паттерна Singleton (одиночка).
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Singleton
{
private:
  Singleton()
  {
     // Инициализация
  }
 
public:
  static Singleton* Instance();
 
  void SomeMethod();
  {
     // ...
  }
  // Полезные методы
 
private:
  static Singleton* instance;
 
  // Необходимые члены данных
}
 
Singleton* Singleton::instance = NULL;
 
Singleton* Singleton::Instance()
{
  if(!instance)
    instance = new Singleton();
 
  return instance;
}
Пример обращения:
C++
1
2
3
Singleton* s = Singleton::Instance();
 
s->SomeMethod();
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 09:18  [ТС]     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #3
Не очень понял. Да и не уверен, понятно ли из постановки, для чего это нужно. Соотвественно не знаю, ту ли задачу ты решил. Мне надо вызвать определённый конструктор ровно один раз при создании одного глобального объекта и запретить его повторный вызов. Требуется единственность не только данных, но и имени объекта, созданного с использованием такого конструктора. Причём, таких конструкторов должно быть несколько по одному в нескольких классах. И я хочу к таким объектам обращаться не
C++
1
a::aeobj
,
C++
1
b::beobj
и так далее, а
C++
1
aeobj
,
C++
1
beobj
и так далее. Все классы имеют и другие конструкторы, которые можно вызывать многократно.

Добавлено через 2 минуты
Кстати, можно ли запретить создание локальных и динамических объектов?
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 10:30     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #4
taras atavin, именно проблему единственности объекта и решает паттерн Singleton. Я лишь привел пример, а не решал какую либо задачу. Почитай про данный паттерн и проблема отпадет.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 10:35  [ТС]     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #5
Единственности чего?
C++
1
2
Singleton *s1 = Singleton::Instance(); // Эйси
Singleton *s2 = Singleton::Instance(); // Это надо запретить, а мне что-то кажется что получится s2=s1. Или я ошибаюсь? И ко всему прочему, объекты динамические, а я хочу статик в глобальной области видимости.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 10:52     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #6
Будет существовать только один объект Singleton в памяти. s1 и s2 будут указывать на этот единственный объект.

Операция Instance как раз таки и предоставляет глобальную точку доступа к единственному объекту Singleton. Это безопаснее, чем использование глобальных переменных. Более подробно можешь ознакомится здесь.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 11:32  [ТС]     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #7
Про единственность имени пропустил? Требуется: один static-объект с одним именем и полный запрет на создание других объектов с теми же адресами за исключением ссылок и указателей. Более того, при создании любого другого объекта того же класса, в нём обязательно должен быть создан закрытый член-указатель или наэтот единственный объект, или на любой третий объект того же класса, прямо или косвенно ссылающийся на единственный. При этом каждый из этих объектов должен иметь и свои индивидуальные данные. Ну и где единственность имени static-объекта? Сам же пишешь, что создадутся два указателя на одну область памяти.

Добавлено через 7 минут
Пример возможного применения: единицы измерения. Библиотека промышлелного назначения есть, а может я хочу ограниченную поддержку астрономических единиц или единиц ядерной физики? Базовая единица энергии электрон вольт может быть только одна, а ты предлагаешь два электрон вольта одного размера, да один ещё не проблема назвать килоэлектронвольтом. Также единственна в базовая единица расстояния. Я могу вместо парсека взять в качестве базовой
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 11:34     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #8
taras atavin, давай определимся что тебе конкретно нужно.
Тебе нужен один единственный экземпляр определенного класса, который единожды создается, и необходимо к этому экземпляру обращаться из любого места программы? Или что-то другое?

А то ты свалил все в одну кучу: единственность объекта, имени и т.д. и т.п.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2010, 11:53     Можно ли создать глобальный обект, вызвав для него закрытый конструктор?
Еще ссылки по теме:

Можно ли объявить глобальный константный заполненный std::vector ? - C++
Хотелось бы, чтоб был объявлен в глобальном пространстве уже заполненный константный статический вектор пар..

Создать конструктор копирования для класса "Прямоугольник" - C++
Всем привет! Помогите разобраться, пожалуйста! Есть такое задание: Определить класс "прямоугольник". Высчитать его...

Создать класс очередь Turn (содержащий числовое поле) и перегрузить для него операторы согласно условию - C++
Помогите пожалуйста, а то я запутался очень сильно. ;c Создать класс очередь Turn (содержит числовое поле). Перегрузить операторы: ...

Для чего нужен возвращаемый тип в перегрузке ввода >> и почему без него него выдаётся ошибка? - C++
Для чего нужен возвращаемый тип в перегрузке ввода >>, какую роль он выполняет что без него него выдаётся ошибка. cin объект istream...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 11:53  [ТС]     Можно ли создать глобальный обект, вызвав для него закрытый конструктор? #9
Пример возможного применения: единицы измерения. Библиотека промышлелного назначения есть, а может я хочу ограниченную поддержку астрономических единиц или единиц ядерной физики? Базовая единица энергии электрон вольт может быть только одна, а ты предлагаешь два электрон вольта одного размера, да один ещё не проблема назвать килоэлектронвольтом. Также единственна в базовая единица расстояния. Я могу вместо парсека взять в качестве базовой единицы пентапарсек, но если нарушить требование единственности, то как привести расстояния? Предположим, у меня два синглетона-гигапарсека
C++
1
2
rast *gigaparsek1=rast::interface;
rast *gigaparsek2=rast::interface;
, указывающие на один адрес в памяти и пентапарсек опеределён как gigaparsek2*1e+6, а терапарсек - как gigaparsek1*1e+3. Даже в этом случае приведение трапарсеков к пентапарсекам и наоборот усложняется. А если ещё один из этих синглетонов использован для квадратного гигапарсека? Хотя, может и для таких целей есть готовые библиотеки, но это просто пример, а мне сейчас нужен принцип. Задача: создать класс, гарантированно единственный глобальный базовый static-объект этого класса и разрешить создание произвольного числа производных объектов, гарантировав при этом построение направленного графа (не дерева), в котором из каждого узла, кроме одного выделенного, выходит ровно одно ребро и входит в другой узел, с каждым ребром обязательно ассоциирована некотрая информация, в выделенный узел рёбра только входят, число рёбер, входящих в каждый узел не имеет формальных ограничений, а от любого узла можно по рёбрам дойти до выделенного.
Yandex
Объявления
24.02.2010, 11:53     Можно ли создать глобальный обект, вызвав для него закрытый конструктор?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru