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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Gibss
Сообщений: n/a
#1

Создание объекта с помощью метода getInstance() - C++

11.10.2011, 15:24. Просмотров 1677. Ответов 10
Метки нет (Все метки)

Помогите написать тестовую программу:

Создайте класс, из которого можно создать только один объект.

• Создание объекта должено проходить через getInstance() метод,
• Повторный "вызов" getInstance() метода должен ссылатся на уже созданный объект, а не создавать новый объект.
• Тестовая программа должна продемонстрировать, что требования будут выполнены.
• Использовать "eager initialization"
• Напишите счетчик, который регистрирует, сколько раз обращались к getInstance() .


Пример использования класса:
/ / Правильное использование (объект посылается через метод)
* SingleInstance *onlyOne = SingleInstance.getInstance;
onlyOne-> doSometing ();

/ / Ограничения
SingleInstance first, second, / / ​​должны быть запрещены
SingleInstance *onlyOne = new SingleInstance ();
/ / новое использование дожно бытй запрещено

Намек: private, public, static
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2011, 15:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание объекта с помощью метода getInstance() (C++):

Создание объекта в функции и возврат объекта из нее - C++
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный в стеке при этом копи конструктор публичный. ...

Проблема вызова метода COM объекта из VB - C++
Помогите решить проблему. Я написал на С++ COM объект и при попытке вызвать его метод из VB, возникает ошибка. Выдается сообщение о том что...

Возвращение временного объекта из метода - C++
Доброго времени суток,господа! Сразу к делу: Имеется следующий код: struct Test { int a; //Lets just exist Test(){}...

Вызов метода для объекта (ооп с++) - C++
Доброе время суток! У меня есть класс class Player {...} есть объект Player user; Есть вызов метода класса Player ...

Передача объекта в качестве аргумента функции (метода) - C++
На "Интуите" имеем код: class Complex { public: int real; // вещественная часть int imaginary; // мнимая часть ...

Обрыв функции при вызове метода из объекта другого класса - C++
Почему выполнение функция обрывается на вызове метода из объекта другого класса? DataBuffer.cpp //Получаем класс FirstDlg void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
11.10.2011, 16:25 #2
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
#include <iostream>
 
using namespace std;
 
class SingleInstance 
{
private:
   SingleInstance() {}
   static SingleInstance* instance;
   static size_t counter;
public:
   static SingleInstance* getInstance()
   {
      if(!instance)
         instance = new SingleInstance;
      ++counter;
      return instance; 
   }
   static size_t GetCounter() { return counter; }
};
 
size_t SingleInstance::counter;
SingleInstance* SingleInstance::instance;
 
int main()
{
   SingleInstance *ins = SingleInstance::getInstance();
   cout<<ins->GetCounter()<<endl;
   SingleInstance *ins2 = SingleInstance::getInstance();
   cout<<ins->GetCounter()<<endl;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:28 #3
Всё же синглтон по окончании работы стоит разрушить.
И для "демонстрации" выводить адреса объекта. Счётчик ведь и копировать спокойно можно, а вот адреса у разных объектов разные.
Gibss
Сообщений: n/a
11.10.2011, 16:30 #4
Спасибо!
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
11.10.2011, 16:32 #5
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
33
34
#include <iostream>
 
using namespace std;
 
class SingleInstance 
{
private:
   SingleInstance() {}
   static SingleInstance* instance;
   static size_t counter;
public:
   static SingleInstance* getInstance()
   {
      if(!instance)
         instance = new SingleInstance;
      ++counter;
      return instance; 
   }
   static size_t GetCounter() { return counter; }
   static void Delete() {delete instance;}
};
 
size_t SingleInstance::counter;
SingleInstance* SingleInstance::instance;
 
int main()
{
   SingleInstance *ins = SingleInstance::getInstance();
   cout<<"counter: "<<ins->GetCounter()<<"; address: "<<ins<<endl;
   SingleInstance *ins2 = SingleInstance::getInstance();
   cout<<"counter: "<<ins2->GetCounter()<<"; address: "<<ins2<<endl;
   
   SingleInstance::Delete();   
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:36 #6
C++
1
2
3
4
5
6
7
 static SingleInstance* getInstance()
   {
      static SingleInstance instance;
 
      ++counter;
      return &instance; 
   }
Добавлено через 27 секунд
Или вместо static SingleInstance* instance использовать auto_ptr<...>

Добавлено через 2 минуты
Цитата Сообщение от gooseim Посмотреть сообщение
C++
1
size_t SingleInstance::counter; SingleInstance* SingleInstance::instance;
Следует инициализировать нулями.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
11.10.2011, 16:37 #7
Deviaphan, по стандарту статические переменные инициализируются нулями сами.
Tiina
Сообщений: n/a
18.10.2011, 09:35 #8
Уважаемые Deviapha & gooseim. Помогите пожалуйста разобратся: в чем разница eager initialization и lazy initialization. Как я поняла, этот пример с eager initialization? Спасибо!
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
18.10.2011, 09:43 #9
gooseim, конструктор копирования и operator=() тоже следует сделать приватными, а иначе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
   SingleInstance *ins = SingleInstance::getInstance();
   cout<<"counter: "<<ins->GetCounter()<<"; address: "<<ins<<endl;
   SingleInstance *ins2 = SingleInstance::getInstance();
   cout<<"counter: "<<ins2->GetCounter()<<"; address: "<<ins2<<endl;
 
   SingleInstance ob1 = *ins;
   cout<<"counter: "<<ob1.GetCounter()<<"; address: "<<&ob1<<endl;
   SingleInstance ob2(ob1);
   cout<<"counter: "<<ob2.GetCounter()<<"; address: "<<&ob2<<endl; 
   
   SingleInstance::Delete();   
}
Код
counter: 1; address: 0x86d1dd0
counter: 2; address: 0x86d1dd0
counter: 2; address: 0xbfa13b37
counter: 2; address: 0xbfa13b36
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 10:24 #10
Цитата Сообщение от Tiina Посмотреть сообщение
в чем разница eager initialization и lazy initialization
С lazy всё просто: объект создаётся только в тот момент, когда в нём возникает потребность. Т.е. до первого вызова GetInstance объект не существует. Слово eager я, к сожалению, не знаю. Но, скорее всего, это вариант с созданием статического объекта в глобальном пространстве.
Оба варианта уже были представлены в коде.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.10.2011, 13:56 #11
Без счетчика правда. Но сделать не проблема.

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
template<typename T>
class Singleton
{
public:
   typedef boost::scoped_ptr<T> ptr_to_type;
 
   static T& instance()
   {
      if (!argument)
      {
         argument.reset(new T());
      }
      return *argument;
   }
private:
   Singleton()
   {
   }
   Singleton(const Singleton&);
   Singleton& operator =(const Singleton&);
   static ptr_to_type argument;
};
 
template<typename T>
typename Singleton<T>::ptr_to_type Singleton<T>::argument;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 13:56
Привет! Вот еще темы с ответами:

С помощью метода отражения найти обратную матрицу - C++
С помощью метода отражения найти обратную матрицу. Матрица размара н*н. Прошу помочь алгоритмом, исходником или хорошей книжкой. Хотя бы...

почему при возврате объекта из метода исчезает поле с динамической памятью - C++
При выходе из метода оператора + динамическая память, которая хранится в объекте класса Vector исчезает. Как исправить эту ситуацию?...

Изменение фактического состояния объекта не мгновенно по вызове метода, а через некоторое время - C++
Хочу сделать чтобы после вызова метода объекта изменение состояния объекта происходило только через некоторое время, например 3 минуты. Как...

При вызове метода функционального объекта в шаблонной функции ошибка компиляции C2039 - C++
Объект класса Entry - это запись в журнале экзаменационной сессии: номер зачетки, фамилия, курс, группа, дисциплина, оценка. В задаче есть...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.10.2011, 13:56
Ответ Создать тему
Опции темы

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