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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Gibss
Сообщений: n/a
11.10.2011, 15:24     Создание объекта с помощью метода getInstance() #1
Помогите написать тестовую программу:

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

• Создание объекта должено проходить через 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++
почему при возврате объекта из метода исчезает поле с динамической памятью C++
Создание объекта в функции и возврат объекта из нее C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.10.2011, 16:25     Создание объекта с помощью метода getInstance() #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++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:28     Создание объекта с помощью метода getInstance() #3
Всё же синглтон по окончании работы стоит разрушить.
И для "демонстрации" выводить адреса объекта. Счётчик ведь и копировать спокойно можно, а вот адреса у разных объектов разные.
Gibss
Сообщений: n/a
11.10.2011, 16:30     Создание объекта с помощью метода getInstance() #4
Спасибо!
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.10.2011, 16:32     Создание объекта с помощью метода getInstance() #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++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:36     Создание объекта с помощью метода getInstance() #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
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.10.2011, 16:37     Создание объекта с помощью метода getInstance() #7
Deviaphan, по стандарту статические переменные инициализируются нулями сами.
Tiina
Сообщений: n/a
18.10.2011, 09:35     Создание объекта с помощью метода getInstance() #8
Уважаемые Deviapha & gooseim. Помогите пожалуйста разобратся: в чем разница eager initialization и lazy initialization. Как я поняла, этот пример с eager initialization? Спасибо!
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
18.10.2011, 09:43     Создание объекта с помощью метода getInstance() #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++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 10:24     Создание объекта с помощью метода getInstance() #10
Цитата Сообщение от Tiina Посмотреть сообщение
в чем разница eager initialization и lazy initialization
С lazy всё просто: объект создаётся только в тот момент, когда в нём возникает потребность. Т.е. до первого вызова GetInstance объект не существует. Слово eager я, к сожалению, не знаю. Но, скорее всего, это вариант с созданием статического объекта в глобальном пространстве.
Оба варианта уже были представлены в коде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 13:56     Создание объекта с помощью метода getInstance()
Еще ссылки по теме:

Возвращение временного объекта из метода C++
Вызов метода для объекта (ооп с++) C++
C++ Передача объекта в качестве аргумента функции (метода)

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.10.2011, 13:56     Создание объекта с помощью метода getInstance() #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;
Yandex
Объявления
18.10.2011, 13:56     Создание объекта с помощью метода getInstance()
Ответ Создать тему
Опции темы

Текущее время: 19:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru