С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 12

Singleton

03.03.2018, 19:45. Показов 2255. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Буду краток. Пропустил пару по Singleton( это только первое занятие было по паттернам). Дали лабу по singleton , а я ничего не пойму. Информации в интернете не так уж и много, не говоря уже про русскоязычную. Так вот задание такое:
1. Создать класс Class_MLib, который должен содержать методы для вычисления значений синуса и
косинуса. Аргументы этих методов должны задаваться в градусах. Точность вычислений значений
синуса и косинуса E = 0.00000001. Класс Class_Mlib должен удовлетворять следующим условиям:
– от класса Class_Mlib нельзя наследоваться;
– должен существовать только 1 экземпляр этого класса;
– объекты класса Class_Mlib должны иметь возможность пользоваться этим экземпляром;
2. Написать консольную программу, организующую ввод значения угла ( в градусах ) и вычисляющую
значения синуса и косинуса этого угла с использованием экземпляра класса Class_Mlib

Уверен что сделал чушь, но по другому никак не разберусь. Писал код исходя из примеров в интернете. Буду очень благодарен за помощь. Собственно вот код:
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
35
36
37
38
39
40
#include <iostream>
#include <locale.h>
#include <math.h>
#include <stdio.h>
 
using namespace std;
 
class MLib
{
public:
    const double PI =3.141592653;
     static MLib& Instance(int gr)
    {
        static MLib s;
        s.Zsin(gr);
        s.Zcos(gr);
        return s;
    }
int Zsin(int a)
{
    float vsin = sin(a * PI / 180);
   printf("%1.8f\n",vsin);
}
int Zcos(int a)
{    float vcos = cos(a * PI / 180);
      printf("%1.8f\n",vcos);
}
private:
    MLib() = default;
    MLib(const MLib& root) = delete;
        MLib& operator=(const MLib&) = delete;
 
};
int main()
{
    setlocale(LC_ALL, "RUS");
int gradus;
cin >> gradus;
auto& instance = MLib::Instance(gradus);
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2018, 19:45
Ответы с готовыми решениями:

Что значит Singleton& operator = ( Singleton& )?
// Singleton.h class Singleton { private: static Singleton * p_instance; // Конструкторы и оператор присваивания...

Паттерн Singleton
Мне вот дали такой код как паттерн Singleton: #include &quot;stdafx.h&quot; template &lt;class T&gt; class SingletonS { static int...

Singleton и MVC
Здравствуйте уважаемые форумчане. Изучаю с++ и столкнулся с понятием паттернов и парадигмы MVC. Прочитав про паттерны и погуглив не...

11
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
03.03.2018, 20:13
Не знаю, насколько полностью удовлетворяет условию,
но я бы написал так:
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
35
36
37
38
#define _USE_MATH_DEFINES
#include <iostream>
//#include <clocale>
#include <cmath>
 
using namespace std;
class Lock                                // «запирающий» класс
{ 
    Lock(){}
    Lock(const Lock&){}
  friend class Mlib;
};
class Mlib: public virtual Lock  
{
public:
    double Zsin(double a)
    {
        return sin(a * M_PI / 180);
    }
    double Zcos(double a)
    {    
        return cos(a * M_PI / 180);
    }
}ss;
//---  проверка невозможности наследования
class B:public Mlib
{
};
int main()
{
    //setlocale(LC_ALL, "RUS");
    //B b; // выдаст ошибку
    double gradus;
    cin >> gradus;
    cout<<ss.Zsin(gradus)<<' '<<ss.Zcos(gradus)<<endl;
    system("pause");
    return 1;
}
1
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 12
03.03.2018, 20:29  [ТС]
А то, как я написал исходя из условия. Является верным? Или как? Просто не до конца разобрался с Singleton`ом. Потому что реально было только первое и единственное занятие по этой теме.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
03.03.2018, 20:31
Цитата Сообщение от zss Посмотреть сообщение
public virtual Lock
А разве, если поместить конструктор в private область от класса можно будет наслудоваться? Все наследованные классы вызывают конструктор базового, а этот они вызвать не смогут и нельзя будет наследоваться.

Цитата Сообщение от Nikita_H Посмотреть сообщение
private: MLib() = default;
Определили конструктор, как я и описал выше.

Цитата Сообщение от Nikita_H Посмотреть сообщение
MLib(const MLib& root) = delete;
MLib& operator=(const MLib&) = delete;
Не даем копировать наш экземпляр класса, ибо конструктор копирования и оператор присаивания геренируются по-умолчанию.

Цитата Сообщение от Nikita_H Посмотреть сообщение
вычисляющую
значения синуса и косинуса этого угла с использованием экземпляра класса Class_Mlib
Вот тут правда косяк вышел

Цитата Сообщение от Nikita_H Посмотреть сообщение
s.Zsin(gr);
s.Zcos(gr);
это надо было делать тут

Цитата Сообщение от Nikita_H Посмотреть сообщение
auto& instance = MLib::Instance(gradus);
0
0 / 0 / 0
Регистрация: 19.01.2017
Сообщений: 12
03.03.2018, 20:39  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
Вот тут правда косяк вышел
Сообщение от Nikita_H
s.Zsin(gr);
s.Zcos(gr);

это надо было делать тут
Сообщение от Nikita_H
auto& instance = MLib::Instance(gradus);

Не понял про последние 2 предложения. Можешь подробней пожалуйста)
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
03.03.2018, 20:55
zss, Помогите понять ваш алгоритм. Я правильно понимаю?
1. Мы создаем конструктор класса Lock в закрытой зоне чтоб нельзя было наследовать класс и создавать его экземпляры.
2. Мы объявляем класс Mlib дружественным чтобы он имел доступ к закрытой зоне.
3. Если мы в классе Mlib наследуем Lock обычным способом, то класс B унаследует только методы класса Mlib и Lock со своим конструктором ему не нужен, т.к. он будет к нему обращаться через Mlib
4. Если мы в классе Mlib наследуем Lock виртуальным наследованием, то мы заставляем класс B напрямую наследовать класс Lock, но т.к. он не является дружественным то и доступа не имеет.

Как понять эту Lock(const Lock&){} строчку? и для чего?

Заранее спасибо!
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
03.03.2018, 21:00
Этот пример я нашел у нас на форуме, см.
Класс, который невозможно наследовать
1
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
03.03.2018, 21:08
"Ленивая" реализация паттерна на С++ (из Википедии) выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class OnlyOne
{
public:
        static OnlyOne& Instance()
        {
                static OnlyOne theSingleInstance;
                return theSingleInstance;
        }
private:        
        OnlyOne(){};
        OnlyOne(const OnlyOne& root) = delete;
        OnlyOne& operator=(const OnlyOne&) = delete;
};
Добавлено через 1 минуту
Я писал на Java, там еще проще:
Java
1
2
3
4
5
6
7
8
9
10
11
public class Singleton {
  private static Singleton instance;
  private Singleton () {}
 
  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Добавлено через 2 минуты
То есть на Java конструктор делается приватным, и создается статический метод getInstanse(), который возвращает созданный уже, или, если его нет, то новый объект.

Простейшая реализация.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2018, 22:23
Цитата Сообщение от Nikita_H Посмотреть сообщение
– должен существовать только 1 экземпляр этого класса;
– объекты класса Class_Mlib должны иметь возможность пользоваться этим экземпляром;
Вот это невозможно понять. Думаю причина в том, что тот кто писал это не думал о том что он делает. Должен существовать только один экземпляр класса означает - один объект. Это потому что речь не о инстансе шаблона (экземпляре класса - буквально), а об объекте данного класса. Теперь скажите, как один объект позволит себе пользоваться многим "собой"?
Вообще, в "вычислительном" классе, операция не должна быть синглтоном, если предполагается возможность построения выражений, - вычислительных цепей. Синглтоном можно бы сделать некий служебный класс. Например это мог бы быть класс инкапсулирующий локаль, чтобы парсер мог всегда правильно интерпретировать десятичную точку. Или класс экземпляр которого определял бы в каких единицах на текущий момент осуществляется ввод. А делать доступ к заданию аргумента в градусах или рублях... Это тоже от лукавого (imho). Сделать то можно всё. Но имело бы смысл учить не операторы писать, а осмысливать то, что делаешь. Тут конечно важно самому иметь навык.
0
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
03.03.2018, 23:10
IGPIGP, тут скорее всего просто тупая задача на закрепления паттерна... Не надо тут искать смысл этой задачи... ТСу просто надо сделать синглтон... Бывает, что преподаватели в вузе не думают, что дают иррациональный процесс для программирования...
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2018, 23:55
Лучший ответ Сообщение было отмечено ildwine как решение

Решение

Цитата Сообщение от ildwine Посмотреть сообщение
IGPIGP, тут скорее всего просто тупая задача на закрепления паттерна...
Так не должно быть. Тупые задачи не могут быть паттерном острого мышления. ildwine, любое понятие начинается с того, что определяется задача. В "тупой" военно-инженерной практике, самым простым паттерном для введения и определения понятия является формула "... предназначен для ... , состоит из ...". Мне приходится сталкиваться с плодами деятельности тех, кого учили решать "тупые" задачи. Лучше бы их не учили.
С точки зрения синглтона, например, важно чтобы человек понял, что набор некоторых данных имеющих глобальное значение для программы удобно сокрыть в объекте класса с глобальным доступом (неважно каков маршрут и есть ли глобальная видимость непосредственно объекта). Сам способ - (фабрика Майерса, например) это конечно важно тоже, но нужно же понять зачем. Конфигурационные компоненты - это то что может потребовать такого зверя. Операции в калькуляторе, - нет. А ведь есть важные вещи.
Нужно вспомнить о том, что порядок инициализации статических переменных в разных единицах трансляции не определён и из-за этого есть ряд неудобств в случаях когда одни синглтоны используют другие синглтоны в частности и статические переменные вообще. Это важнее чем сама "тупая" техника.
4
Почетный модератор
 Аватар для ildwine
6201 / 2963 / 1300
Регистрация: 04.03.2013
Сообщений: 5,797
Записей в блоге: 1
03.03.2018, 23:58
IGPIGP, спасибо вам, я то это понимаю...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2018, 23:58
Помогаю со студенческими работами здесь

Реализация Singleton
Приветствую. Пытался реализовать паттерн проектирования Singleton для лога след. образом: class Logger { public: void...

Singleton и DLL
DLL .h class EXPORT LOG { public: LOG() { x = this; } void test();

Паттерн Singleton
Здравствуйте. Например есть класический одиночка и загрузка музыки. Возможно ли сделать загрузку и вопроизведение музыки через класс...

Singleton. Одиночка. Паттерн
Как реализовать паттерн Singleton на C++? Делаю так: Заголовочный файл: class Play { private: Play(void); ~Play(void);

Singleton vs static class
Зачем этот синглтон, если его можно представить как класс с статическими полями и методами. Какой случай я упускаю?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru