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

Singleton

03.03.2018, 19:45. Показов 2292. Ответов 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
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
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
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
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
9007 / 4708 / 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
9007 / 4708 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru