powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / использование map в синглетоне
18 сообщений из 43, страница 2 из 2
использование map в синглетоне
    #34895685
MacKintosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков
Я привел вариант без динамичкой памяти.
Вы привели вариант без new.
Динамическая память там всё равно есть.
Что по Вашему делает

Код: plaintext
1.
m_map[key] = value;
?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895709
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MacKintosh Анатолий Широков
Мембер map, по-сути, быть статическим мембером быть не должен.
Что за суть такая?
С сиглом, правда, разницы особой нет...
Но если и статик - кому это мешает?

Суть, как всегда, заключается в здравом смысле и логике. Член данных map хоть и является единственным экзмепляром для всего приложения, но это не его заслуга, а заслуга класса членом которого он является, поскольку экземпляр этого класса должен быть только один. Поэтому с точки зрения концептуальной чистоты, данные, которые описывают состояние объекта (а не семейста) должны быть членами данных класса, а не статическими членами данных (сорри за дубль, но иначе не скажешь). Объяви map статиком и мы допустим семантическую ошибку, заявив о том, что map является состоянием семейства объектов класса, а не конкретного экземпляра.
Ну, вообщем, понятно. :)
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895720
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MacKintosh Анатолий Широков
Я привел вариант без динамичкой памяти.
Вы привели вариант без new.
Динамическая память там всё равно есть.
Что по Вашему делает

Код: plaintext
1.
m_map[key] = value;
?

Ну это уже придирки. Разумеется там динамическая память есть, конечно. Но когда я это писал, я хотел акцентировать внимание на том, что нет нужды выделять память под map и только.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895721
MacKintosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков MacKintosh Анатолий Широков
Мембер map, по-сути, быть статическим мембером быть не должен.
Что за суть такая?
С сиглом, правда, разницы особой нет...
Но если и статик - кому это мешает?

это не его заслуга, а заслуга класса членом которого он является
Верно.
А вот если сделать map статиком, это уже будет его заслугой. Если даже у нас не будет сингла, все парамсы смогут иметь общий map.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895733
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MacKintosh Анатолий Широков MacKintosh Анатолий Широков
Мембер map, по-сути, быть статическим мембером быть не должен.
Что за суть такая?
С сиглом, правда, разницы особой нет...
Но если и статик - кому это мешает?

это не его заслуга, а заслуга класса членом которого он является
Верно.
А вот если сделать map статиком, это уже будет его заслугой. Если даже у нас не будет сингла, все парамсы смогут иметь общий map.

Еще раз повторю, то что является состоянием объекта, надо делать членом данных. Сам map никакой семантической нагрузки не несет, он приобретает смысл в контексте некоторой концепции. В данном случае этой концепцией является "менеджер параметров" (Params). И если будет сказано, что все экземпляры этого класса должны разделять одно и тоже множество параметров, то только в этом случае мы объявим map как static и то это будет деталью реализации, а не вещью в себе.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895984
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков

Суть, как всегда, заключается в здравом смысле и логике. Член данных map хоть и является единственным экзмепляром для всего приложения, но это не его заслуга, а заслуга класса членом которого он является, поскольку экземпляр этого класса должен быть только один. Поэтому с точки зрения концептуальной чистоты, данные, которые описывают состояние объекта (а не семейста) должны быть членами данных класса, а не статическими членами данных (сорри за дубль, но иначе не скажешь). Объяви map статиком и мы допустим семантическую ошибку, заявив о том, что map является состоянием семейства объектов класса, а не конкретного экземпляра.
Ну, вообщем, понятно. :)
понятно, надо убрать map из статики.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    class Params
    {
        private:
            static bool instanceFlag;
            static Params *single;
            map<string,string> *_prm;

            Params::Params()
            {
               _prm = new map<string,string>();
            }
   [code]  
  }
вот так ?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895987
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где инициализировать map?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34896007
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akalendгде инициализировать map?

В конструкторе Params. Только еще раз повторю, нет никакой нужды в том, чтобы размещать ваш map в динамической памяти - если вы откажетесь от указателя, то map инициализируется по умолчанию сам:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Params
{
private:
     /* 
          идентификаторы начинающиеся c _ или __ зарезервированы для нужд библиотек 
          стандартом
     */
     map<string,string> m_map; 

     Params()  /* : m_map() - необязательная инициализация, поскольку вызов констуктора по умолчанию происходит и так */
     {
     }
public:
      /* а теперь вам останется добавить функцию, которая и обеспечивает 
          инстанцирование и доступ к единственному экмепляру и, заметьте, что 
          больше ничего не требуется, чтобы организовать синглетон (пока оставим многопоточность)
     */
     static Params& getInstance() {
           // вот здесь и произойдет инициализация единственного экмепляра и будет вызван конструктор
           static Params singleton; 
           return singleton;
     }
     ...
};
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898223
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
#include <map>
#include <utility>
using namespace std;
    class Params
    {
        private:
            static bool instanceFlag;
            static Params *single;
            static map<string,string> *_prm;
            map<string,string> m_map; 

            Params::Params()
            {
              //  _prm = new map<string,string>();
            }
            
            
        public:

            static Params::Params* getInstance()
            {
                if( single!=NULL) // instanceFlag
                {
                    single = new Params();
                    return single;
                }
                else
                {
                    return single;
                }
            }

            void Params::setParam(string key, string value )
            {
                pair<string,string> p = pair<string,string>( key,value );
                _prm->insert( p );
                m_map[ key ] = value;;
            }

            string Params::getParam(string key )
            {
                string str = (*_prm)[key];
                return str ;
            }
                    
            Params::~Params()
            {
                //single=NULL;
                instanceFlag = false;
            }
            
    };
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898234
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему я задал этот вопрос, потому-что при вышеприведенном коде я пробовал и у меня выдавало на код
Код: plaintext
1.
2.
3.
4.
            void Params::setParam(string key, string value )
            {
                m_map[ key ] = value;;
            }
*** Signal 11

по этому я и решил сделать динамическое размещение мар
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898239
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а также делал и с
Код: plaintext
1.
2.
3.
                pair<string,string> p = pair<string,string>( key,value );
                _prm->insert( p );
                m_map.insert( p );
*** Signal 11
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898246
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объявлял
Код: plaintext
mutable map<string,string> m_map;
то же сиг 11.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898298
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что есть за зверь Signal11 надо догадаться по каким признакам, интересно? текста там никакого нет?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898366
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akalendобъявлял
Код: plaintext
mutable map<string,string> m_map;
то же сиг 11.

У меня предложение. Скопируйте к себе следующий код:

Код: plaintext
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 <map>
#include <string>
#include <iostream>

class Params
{
      mutable std::map<std::string, std::string> m_map;
private:
      Params() {}
public:
      static Params& getInstance() {
             static Params singleton;
             return signleton;
      }
      
      const std::string& getParam(const std::string &key) const
      {
             return m_map[key];
      }
      void setParam(const std::string &key, const std::string &value)
      {
             m_map[key] = value;
      }   
}; 
int main()
{
    Params& params = Params::getInstance();
    params.setParam("test", "test");
    std::cout << params.getParam("test");
}

Он работает?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898499
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гы сигнал 11 - Segmentation Fault Core Dumped
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898595
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$ g++ singleton2.cpp
singleton2.cpp: In static member function `static Params& Params::getInstance()':
singleton2.cpp:13: error: `signleton' was not declared in this scope
singleton2.cpp:30:2: warning: no newline at end of file
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898612
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код работает,
в имене переменной была допущена синтактич. ошибка
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34898621
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int main()
{
    Params& params = Params::getInstance();
    params.setParam("test", "test");
    std::cout << params.getParam("test");

    Params& params2 = Params::getInstance();
    std::cout << params2.getParam("test");
}
выдает как и должно два раза тест
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / использование map в синглетоне
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]