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

класс Одиночка - C++

Восстановить пароль Регистрация
 
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
25.09.2012, 00:03     класс Одиночка #1
есть один приме класса Синглтон:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CSingleton
{
public:
    static CSingleton* GetInstance (void);
    static void DestroyInstance (void) 
    { 
        if (m_instance) 
        delete m_instance;
    } ;
private:
    static CSingleton* m_instance;
protected:
    CSingleton(){};
};
CSingleton* CSingleton::m_instance = NULL;
CSingleton* CSingleton::GetInstance()
 {
    if (!m_instance) 
        m_instance = new CSingleton;
    return m_instance;
}
и второй
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
// singleton.h
class Singleton
{
public:
    static Singleton & GetInstance()
    {
        if (!m_pInstance)
        {
            m_pInstance = new Singleton();
        }
        return *m_pInstance;
    }
    void SomeMethod(){}
private:
    Singleton(){}
    static Singleton *m_pInstance;
};
// singleton.cpp
Singleton* Singleton::m_pInstance = NULL;
 
int main(int argc, char * argv[])
{
    Singleton& singleton = Singleton::GetInstance();
    singleton.SomeMethod();
    return 0;
}
В первом случае строка №4 передаётся указатель,а во втором ссылка(строка №5).
Классы то по сути выполняют одно и тоже.Ошибка во 2м примере?Или я не уловил сути?Если можно вкратце обьъясните,плз
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2012, 00:03     класс Одиночка
Посмотрите здесь:

C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
C++ Паттерн "Одиночка" и конструктор копии с оператором присваивания
C++ Паттерн "Одиночка" и динамическая память
C++ Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами
Класс, производный класс, паблик-класс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.09.2012, 00:17     класс Одиночка #2
можно ссылку возвращать, а можно указатель. и то и другое корректно.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.09.2012, 00:50     класс Одиночка #3
Второй лучше хотя бы потому, что в нём нет неправильно не совсем правильно работающего DestroyInstance().

Хотя, это как посмотреть. Если это не феникс, то, кхм, приемлемо. Но всё равно защита от дураков бы не помешала.

А ещё серьёзно лучше, потому что встречные поперечные не могут вам взять и убить объект. По крайней мере легко.
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
25.09.2012, 17:32  [ТС]     класс Одиночка #4
Дык в первом случае
C++
1
m_instance = new CSingleton;
есть оператор new.Везде пишут если есть new должен быть delete...
Выделли память,будь добр освободи..
Или я не прав?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.09.2012, 19:26     класс Одиночка #5
Всё окей. Но вот не дай бог какой-нибудь Вася сделает два раза DestroyInstance() в разных местах. Или DestroyInstance() в одном, а потом GetInstance() в другом.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.09.2012, 20:01     класс Одиночка #6
есть еще так называемый синглтон мейерса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Singleton
{
  public:
   static Singleton& Instance()
   {
      // тут деструктор позовется, когда будет уничтожатся статический объект
      // std::auto_ptr<Singleton>
      static std::auto_ptr<Singleton> instance(new Singleton());
      return *instance;
   }
 
   // ну или так:
   static Singleton& Instance()
   {
      static Singleton instance;
      return instance;
   }
   ...
};
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
25.09.2012, 20:02     класс Одиночка #7
Какой-то неполноценный 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
#include <iostream>
 
class Singleton
{
public:
    static Singleton & GetInstance()
    {
        if (!m_pInstance)
        {
            m_pInstance = new Singleton();
        }
        return *m_pInstance;
    }
    void SomeMethod(){}
private:
    Singleton(){}
    static Singleton *m_pInstance;
};
// singleton.cpp
Singleton* Singleton::m_pInstance = NULL;
 
int main(int argc, char * argv[])
{
    Singleton& singleton = Singleton::GetInstance();
    Singleton ob1(singleton), ob2 = singleton;
    
    std::cout << &ob1 << " " << &ob2 << " " << &singleton << std::endl;
    
    return 0;
}
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
25.09.2012, 21:39  [ТС]     класс Одиночка #8
Kastaneda, можете тогда уже пояснить?))))
Смысл доавленных строк?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
25.09.2012, 22:21     класс Одиночка #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я легко создал новые разные объекты
C++
1
Singleton ob1(singleton), ob2 = singleton;
а то, что объекты действительно разные, подтверждается здесь
C++
1
std::cout << &ob1 << " " << &ob2 << " " << &singleton << std::endl;
выводятся разные адреса.

Чтоб получился singleton нужно в privete область добавить конструктор копирования и operator=().
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
25.09.2012, 23:00  [ТС]     класс Одиночка #10
для того чтобы выполнялось корректное копирование и =?
Спасибо про это нигде не написано.Постараюсь разобраться

Добавлено через 17 минут
надо добавить что то вроде?
C++
1
2
Singleton(const Singleton& foo);
const Singleton& operator=(Singleton&);
Добавлено через 2 минуты
в private:
самособой разумеется
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.09.2012, 06:57     класс Одиночка #11
Ага, у меня в коде используется только конструктор копирования, но оператор = тоже нужно сделать приватным.
Цитата Сообщение от RASHFor Посмотреть сообщение
для того чтобы выполнялось корректное копирование и =?
Нет, как раз для того чтобы оно не выполнялось.
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
26.09.2012, 20:29  [ТС]     класс Одиночка #12
И всё же.... для синглтона память выделяется, однако по какой-то причине не освобождается. Можно, конечно, сказать, что для синглтона это не является серьезной проблемой, так как его время жизни совпадает с временем работы программы.
Зачем делать неправильно, если можно сделать правильно?
И я лучше вникну в суть.
мерси)

Добавлено через 7 минут
и как то можно контролировать с помощью умных указателей,в частности shared_ptr.
Можете приветси код на примере моего класса.
Буду признателен.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.09.2012, 13:26     класс Одиночка #13
я вроде привел пример с авто поинтером.
объект авто-поинтера является статическим. деструктор у него позовется если он был создан. а в своем деструкторе он убивает то, на что указывает. деструктор этот зовется уже после выхода из main.
RASHFor
6 / 6 / 0
Регистрация: 12.02.2012
Сообщений: 224
27.09.2012, 15:48  [ТС]     класс Одиночка #14
ДУ,у Вас не хвататет запрета к.копирования и присваивания.Так?Нужно добавить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2012, 16:34     класс Одиночка
Еще ссылки по теме:

C++ Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка
Класс одиночка! C++
Отдельно класс данных, класс формул и главный класс C++

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.09.2012, 16:34     класс Одиночка #15
изначальный вопрос был относительно того, как создавать инстанс синглтона и как его убить автоматически. вот там и были функции, в которых это и приведено. остальные детали синглтона скрыты в многоточии . конечно же нужно еще запрещать всякие конструкторы и копирования.
Yandex
Объявления
27.09.2012, 16:34     класс Одиночка
Ответ Создать тему
Опции темы

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