Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2014, 03:42   #1
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию Синглетон

Столкнулся впервые с таким. Нужна помощь по объяснению почему и как и для чего так устроено.

MyClass.h
Код:
#pragma once

#include <iostream>

class  MyClass
{
private:

	MyClass(); // конструктор и деструктор, это ясно.
	~ MyClass();

public:

	static MyClass& getMyClass(); // это мне неведомо

	static void destroyMyClass(); // static метод

};
MyClass.cpp
Код:
#include "MyClass.h"

MyClass::MyClass() // конструктор, деструктор
{

}

MyClass::~MyClass()
{

}

MyClass& MyClass::getMyClass() // не знаю
{
	static MyClass *myClass = NULL; // не знаю, но видно что присваивается NULL (на указатель похоже)

	if(myClass== NULL) // ясно
	{
		myClass= new MyClass(); // неясно

		std::cout << "Created MyClass" << std::endl; 
	}

	return *myClass; // что возвращает не знаю (указатель, наверное, типа MyClass)
}

void MyClass ::destroyMyClass()
{
	MyClass *myClass = &getMyClass(); // не знаю, но есть подозрения

	if(myClass != NULL) delete myClass; // похоже на действие с деструктором

	std::cout << "MyClass destroyed" << std::endl;
}
[/QUOTE]

main.cpp
[QUOTE]
#include <iostream>
#include "MyClass.h"

int main(int argc, char **argv)
{
	MyClass *myClass= &MyClass::getMyClass(); // ?
	MyClass::destroyMyClass();

	std::cin.get();
}
From Stilet: Оформление поправил.

И чем отличается, к примеру, MyClass *myClass от MyClass* myClass а также MyClass &myClass от MyClass& myClass?

Последний раз редактировалось Stilet; 16.12.2014 в 07:48.
X-Key вне форума Ответить с цитированием
Старый 16.12.2014, 07:25   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
И чем отличается, к примеру, MyClass *myClass от MyClass* myClass а также MyClass &myClass от MyClass& myClass?
Ровным счётом ничем.
MyClass *myClass
MyClass* myClass
MyClass * myClass
Такие записи допустимы. Отличие только в стиле оформления.
Да и код нужно обрамлять тегами [CODE], а не [QUOTE] тогда он смеяться перестанет.
Код:
MyClass::DestroyMyClass();
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 16.12.2014, 08:03   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Разницы в записях никакой нет, но "правильнее" писать MyClass *myClass и MyClass &myClass, ибо меньше вероятность допустить такую ошибку: MyClass* a, b, c (угадайте сколько тут объявляется указателей, а сколько объектов).
static методы - это методы, которые работают в рамках класса, а не объекта.
NULL - это нулевой указатель, используется для обозначения того, что указатель указывает вникуда и за ним нет никаких данных.
Код:
MyClass& MyClass::getMyClass() // не знаю
{
	static MyClass *myClass = NULL; // инициализация статической переменной, делается это не при каждом вызове метода, а только один раз

	if(myClass== NULL) // указатель не показывает ни на какой объект
	{
		myClass= new MyClass(); // значит создаёт объект и выставляем указатель на него

		std::cout << "Created MyClass" << std::endl; 
	}

	return *myClass; // возвращает ссылку на объект
}
разница ссылки и указателя в том, что ссылка всегда ссылается на объект, как и за каждой переменной всегда есть данные. Указатели могут быть NULL или ссылаться неизвестно куда, с ними нужны дополнительные проверки, которых есть в коде.
Чтобы понять что происходит в коде, почитайте уже про паттерн синглтон.
в destroyMyClass лишняя первая строка.
pu4koff вне форума Ответить с цитированием
Старый 16.12.2014, 17:50   #4
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию

Спасибо за ответ! Теперь меньше пробелов. Буду очень признателен если поясните принцип работы синглтона. Понимаю, что можно найти и почитать, но мне понятнее когда человек объясняет на своих словах.
X-Key вне форума Ответить с цитированием
Старый 16.12.2014, 17:53   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от X-Key Посмотреть сообщение
Спасибо за ответ! Теперь меньше пробелов. Буду очень признателен если поясните принцип работы синглтона. Понимаю, что можно найти и почитать, но мне понятнее когда человек объясняет на своих словах.
А, что такое синглитон?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 16.12.2014, 17:53   #6
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию

Еще где-то видел, что он хорошо подходит в плане менеджера.

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
А, что такое синглитон?
Ну, это класс с одним единственным объектом. Вот только не пойму суть как он работает. В чем и прошу помощи.

Последний раз редактировалось Stilet; 17.12.2014 в 07:38.
X-Key вне форума Ответить с цитированием
Старый 16.12.2014, 18:33   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Мода на синглтоны была недолгой. Развитие многопоточных приложений и всяких юнит тестов свело на нет пользу использования синглтонов. Некоторые считают, что его из паттернов нужно перенести в антипаттерны.
По сути это аналог глобальной переменной. Если есть что-то, что неизвестно кто должен создавать, а нужно это чуть более, чем везде, то синглтон в руки. Да, менеджер чего-то там напрашивается первым делом.
В простейшем случае, как здесь, работает синглтон как "ленивая" инициализация.
Пока никому объект не нужен, он и не создаётся. Как только кто-то его запросил через соответствующий метод, объект создаётся и возвращается ссылка/указатель на него. Если кто-то запросил объект, а он уже создан, то второй экземпляр не создаётся, а возвращается уже имеющийся объект. Есть всякие разные вариации, основная суть в том, что у класса есть один объект и не нужно ломать голову как его передавать по разным функциям, как создавать, удалять,... эдакая вещь для лентяев
pu4koff вне форума Ответить с цитированием
Старый 16.12.2014, 18:53   #8
X-Key
Пользователь
 
Регистрация: 03.10.2012
Сообщений: 33
По умолчанию

Ясно. Надо поработать с ним на практике, чтобы запомнить.
И все-же осталась еще одна неясная вещь )
Код:
MyClass& getMyClass();
MyClass& getMyClass(); тут неясно, создается метод с ссылкой на (класс?)

Код:
static MyClass *myClass = NULL; // инициализация статической переменной с типом чего? Я догадываюсь, что тип класса, это тип для его объектов?
Как я понимаю myClass - имеет ф-цию объекта класса?

Все спасибо! Ко мне снизошло понимание! )

Последний раз редактировалось Stilet; 17.12.2014 в 07:39.
X-Key вне форума Ответить с цитированием
Старый 16.12.2014, 19:05   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Метод getMyClass возвращает ссылку на объект класса MyClass.
pu4koff вне форума Ответить с цитированием
Старый 16.12.2014, 19:14   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
MyClass& getMyClass(); тут неясно, создается метод с ссылкой на (класс или конструктор?)
Нифега. Ты доступаешься к объекту по итератору, но не к классу.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц