Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320

Паттерн Одиночка

26.11.2010, 02:16. Показов 3888. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема: Написал 4 паттерна, хотел раскинуть на 5 пректов (4 паттерна и main, где они срабатывают ). (если не задействовать паттерн singleton, то все 3 паттерна срабатывают)Но при задействовании паттерна Singleton cтало ругаться на методы паттерна singleton , типа они уже определены. Почему нельзя переносить работу singleton(а) в отдельный cpp проект?

Вот мой 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
class singleton
{
private:
    singleton(){}
    static singleton *single;
public:
    static singleton *add1();
    void print1();
};
 
singleton *singleton::single=0;
 
singleton * singleton::add1()
{
    single = new singleton();
    return single;
}
void singleton::print1()
{
    cout<<" singleton method"<<endl;
}
  
void main()
{
    singleton *obj;
    obj=singleton::add1();
    obj->print1();
    system("pause");
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2010, 02:16
Ответы с готовыми решениями:

Паттерн MVC
Здравствуйте, уважаемые форумчане! Написал небольшую программу, следуя шаблону MVC (Model-View-Controller). Посмотрите, пожалуйста, всё...

Паттерн мост
Добрый день! Уважаемые форумчане подкиньте пожалуйста идейку по реализации моста. У меня есть два интерфейса: IDBForm и IManager. ...

Паттерн command
Реализую клиент серверное приложение(сокеты). Для выполнения команд от пользователя имею функцию. Для выполнения команд от пользователя...

10
Заблокирован
26.11.2010, 03:29
Это не синглетон, это фигня какая-то. Хотя бы потому что метод add1 будет каждый раз создавать новый объект. И указатели здесь - зло, ибо утечка (потому что нет места, где динамически созданный экземпляр в конце работы приложения грохнется), а вместе с методом add1 - утечка при каждом обращении.

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
#include <iostream>
 
class Singleton
{
private:
    Singleton() { }
public:
    static Singleton& Instance();
    void Print();
};
 
Singleton& Singleton::Instance()
{
    static Singleton singleton;
    return singleton;
}
 
void Singleton::Print()
{
    std::cout << "Singleton method" << std::endl;
}
 
int main()
{
    Singleton::Instance().Print();
    return 0;
}
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
26.11.2010, 08:56
Синглтон — это такая штука, у которой в обязательном порядке скрыты конструкторы, в т.ч. и конструктор копирования.
Лично мне кажется, что правильно работать с ним примерно так:
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
#include <iostream>
 
class singleton {
public:
    static void show () { get_instance().do_show(); }
 
private:
    singleton () {}
    singleton (const singleton & s);
    ~singleton () {}
    
    void do_show () const { std::cout << "Я синглтон!" << std::endl; }
    
    static singleton & get_instance () { return instance; }
 
private:
    static singleton instance;
};
 
// Инициализация статической переменной.
singleton singleton::instance;
 
int main (int argc, char * const argv[]) {
    singleton::show();
 
    return 0;
}
А именно: метод "get_instance" прячется, а вся портянка вокруг него оборачивается в статические функции.
Сам экземпляр ("instance") можно объявлять как у меня — в классе, а можно и как у NightmareZ — прямо в функции взятия экземпляра.

Так же почитай про одиночку здесь.

NightmareZ, прокололся. Первый раз отмазка "это был не синглтон" прокатила, а в этой теме, извини, не пройдёт. Так что, извини,
Цитата Сообщение от NightmareZ Посмотреть сообщение
Это не синглетон, это фигня какая-то.
0
Заблокирован
26.11.2010, 13:46
Бгага, ещё один Нынче что ни программист, то ржака.

Цитата Сообщение от volovzi Посмотреть сообщение
Синглтон — это такая штука, у которой в обязательном порядке скрыты конструкторы, в т.ч. и конструктор копирования.
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

У тебя же какая-то фигня, которая ничем принципиально от статического класса не отличается.

Цитата Сообщение от volovzi Посмотреть сообщение
Так же почитай про одиночку здесь.
Правильно, почитай, чтобы ересь больше не писать и не тыкать тех кто знает носом в элементарные вещи.

Цитата Сообщение от volovzi Посмотреть сообщение
NightmareZ, прокололся. Первый раз отмазка "это был не синглтон" прокатила, а в этой теме, извини, не пройдёт. Так что, извини,
Не извиняю. Ты бред пишешь с умным видом.
Я написал корректную реализацию синглтона, ты же - реализацию непонятно чего.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
26.11.2010, 14:18
Цитата Сообщение от NightmareZ Посмотреть сообщение
Правильно, почитай, чтобы ересь больше не писать и не тыкать тех кто знает носом в элементарные вещи.
Это предназначалось не тебе.

Я написал корректную реализацию синглтона...
То, что ты написал, синглтоном не является по твоему же определению: "Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа". Я могу создать сколько угодно экземпляров твоего класса следующим образом:
C++
1
Singleton s(Singleton::Instance());
0
Заблокирован
26.11.2010, 14:23
Цитата Сообщение от volovzi Посмотреть сообщение
То, что ты написал, синглтоном не является по твоему же определению: "Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа". Я могу создать сколько угодно экземпляров твоего класса следующим образом:
C++
1
Singleton s(Singleton::Instance());
Фактически это будет всё тот же объект. Иногда придётся реализовывать конструктор копирования, но сути дела это не меняет.
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
26.11.2010, 14:32
Цитата Сообщение от NightmareZ Посмотреть сообщение
Фактически это будет всё тот же объект.
Нет, не будет.
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
{
private:
    Singleton() { }
public:
    static Singleton& Instance();
    
    int x;
};
 
Singleton& Singleton::Instance()
{
    static Singleton singleton;
    return singleton;
}
 
int main()
{   
    Singleton::Instance().x = 17;
    
    Singleton s(Singleton::Instance());
    s.x = 49;
    
    std::cout << Singleton::Instance().x << std::endl; // 17
    std::cout << s.x << std::endl;                     // 49
    
    return 0;
}
0
Заблокирован
26.11.2010, 14:39


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Singleton
{
private:
    Singleton() { }
    Singleton(const Singleton& singleton) { }
public:
    static Singleton& Instance();
    void Print();
};
 
Singleton& Singleton::Instance()
{
    static Singleton singleton;
    return singleton;
}
 
void Singleton::Print()
{
    std::cout << "Singleton method" << std::endl;
}
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
26.11.2010, 14:44
Я б его вообще без тела объявил, но не суть.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
26.11.2010, 14:56
То, что ты написал, синглтоном не является по твоему же определению: "Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа". Я могу создать сколько угодно экземпляров твоего класса следующим образом:
volovzi:
Вообще то статическая память, выделяется один раз при первой передаче управления,
последующий вызовы функции уже не создают объект, функция будет возвращать
ссылку на один и тот же объект при каждом вызове.

C++
1
2
3
4
5
6
7
  Singleton::Instance().x = 17;
        
        Singleton s(Singleton::Instance());
        s.x = 49;
        
        std::cout << Singleton::Instance().x << std::endl; // 17
        std::cout << s.x << std::endl;                     // 49
И что этим хотели показать, то что конструктор копирования разрешен,
так можно запретить и копировать не будет.
1
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
26.11.2010, 15:11
Лучший ответ Сообщение было отмечено как решение

Решение

Genius Ignat, перед комментированием принято читать тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2010, 15:11
Помогаю со студенческими работами здесь

паттерн Observer
Гуру программирования, просветите по данному сабжу (расскажите человеческим языком/направьте ссылками), очень интересно:) p.s. ...

Декоратор(паттерн)
Привет, у меня есть вектор std::vector&lt;cShape*&gt; figures; помещаю в него 2 квадрата cShape* sq1 = new cSquare(&quot;sq1&quot;,...

Выбрать паттерн проектирования
Есть вот такое задание: &quot;Разработать программное приложение, позволяющее проводить анализ алгоритмов нахождения обратных матриц....

Как называется паттерн?
Всем привет. По работе, пришлось реализовать некую структуру, где за основу был взять паттерн Одиночка. Принцип работы заключается...

Как называется паттерн?
здравствуйте, в общем начитался тут всякого: http://mariusbancila.ro/blog/2014/10/15/extension-methods-in-cpp/ сам раньше кодил...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru