powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / использование map в синглетоне
25 сообщений из 43, страница 1 из 2
использование map в синглетоне
    #34892253
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
компилятор gcc
Код: 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.
    class Params
    {
        private:
            static bool instanceFlag;
            static Params *single;
            map<string,string>* _prm;

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

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

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

            string Params::getParam(string key )
            {
                return _prm[key] ;
            }
                    
            Params::~Params()
            {
                instanceFlag = false;
            }
    };
и что я не делал,
и map<string,string>* _prm; объявлял как статик
и просто map<string,string> _prm; (без инициализации _prm = new map<string,string>(); )
то выдает ошибку компиляции, то выдет sigfault приобращении к _prm.

что посоветуете?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892303
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892421
Код: plaintext
1.
2.
3.
4.
5.
            void Params::setParam(string key, string value )
            {
                pair<string,string> p = pair<string,string>( key,value );
                _prm->insert( p );
            }
- это, возможно, не будет работать правильно (зависит от заданной логики поведения), т.к. если элемент со вставляемым значением (value) уже есть в мапе, то insert вернет пару со вторым значением == false и ничего не вставит. Чтобы этого не происходило надо вставлять иначе:
Код: plaintext
1.
2.
3.
4.
            void Params::setParam(string key, string value )
            {
                _prm[key] = value;
            }
Еще бывает не удобно писать параметры конструктора у pair - можно использовать make_pair (это функция, а значит шалонные параметры могут выводится автоматически):
Код: plaintext
1.
                pair<string,string> p = make_pair( key,value );
В getInstance, действительно, флаг не нужен и перепутаны условия. Кроме того, переменную можно объявить статической прямо в методе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
            static Params::Params* getInstance()
            {
                static Params *single =  0 ;
                if( single ==  0 ) 
                {
                    single = new Params();
                }
                return single;
            }
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892432
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала надо убрать статический метод класса из хидера в сpp
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892559
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, на мой вгляд, прекрасно обойтись без динамической памяти:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;
      }   
};
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892562
blindedСначала надо убрать статический метод класса из хидера в сpp
И что это изменит?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892571
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedСначала надо убрать статический метод класса из хидера в сpp
да он, вроде, не мешает :)
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892574
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.

Мембер map, по-сути, быть статическим мембером быть не должен.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892622
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
      static Params& getInstance() {
             static Params singleton;
             return signleton;
      }
Будет торчать в каждом модуле где инклудится ваш h и в каждом модуле будет свой map
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892633
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дался вам этот синглтон... У него же функционала никакого нет, кроме хранения ОДНОГО мапа. Нельзя тупо создать один СТАТИЧЕСКИЙ мап и юзать?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892653
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изыди! Это модель!
Кстати вон там валяется на скрепке
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892704
И вот это тоже надо, наверное, исправить:
Код: plaintext
1.
2.
3.
4.
            string Params::getParam(string key )
            {
                return _prm[key] ;
            }
на такое:
Код: plaintext
1.
2.
3.
4.
            std::pair< std::map<std::string, std::string>, bool >::iterator Params::getParam(string key )
            {
                return _prm.find(key) ;
            }
- иначе, если значения с key в мапе не было, оно вставится новое (пустое).
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892847
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
Код: plaintext
1.
2.
3.
4.
      static Params& getInstance() {
             static Params singleton;
             return signleton;
      }
Будет торчать в каждом модуле где инклудится ваш h и в каждом модуле будет свой map

У вас неверное понимание статических функций класса. То что вы сейчас сказали относится лишь к статическим переменным определенных в заголовочном файле. Что же касается приведенного кода, то он благополучно будет возвращать один единственный экземпляр класса Params, созданный при первом входе в статическую фукцию класса getInstance(). Учите матчасть ;)
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892872
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня очень правильное понимание... Реализаций статического метода будет ровно по одному на каждый модуль и в каждом модуле будет своя локальная статическая переменная
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892886
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedУ меня очень правильное понимание... Реализаций статического метода будет ровно по одному на каждый модуль и в каждом модуле будет своя локальная статическая переменная

Вы говорите ерунду. Вы хотя бы проверьте это на своем любимом компиляторе.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892888
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.
пример взят от сюда http://www.codeproject.com/cpp/singletonrvs.asp

попробовал без instanseFlag - все работает, действительно лишний
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892893
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedУ меня очень правильное понимание... Реализаций статического метода будет ровно по одному на каждый модуль и в каждом модуле будет своя локальная статическая переменная

Статическая функция и статический метод класс - это две большие разницы. Вы выдимо провели аналогию, а этого делать не стоило.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892899
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
следал так (временно)
все Ваши пожелания учту и исправлю.
что касается return _prn[key] на _prn->find(key)
Код: 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.
52.
53.
54.
55.
#include <map>
#include <utility>
using namespace std;
{

    class Params
    {
        private:
            static bool instanceFlag;
            static Params *single;
            static map<string,string> *_prm;

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

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

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

            string Params::getParam(string key )
            {
                string str = (*_prm)[key];
                return str ;
            }
                    
            Params::~Params()
            {
                //single=NULL;
                instanceFlag = false;
            }
            

    };


в маине надо прописать иначе возникнут ошибки компиляции
Код: plaintext
1.
2.
bool Params::instanceFlag = false;
Params* Params::single = NULL;
map<string,string> * Params::_prm = new map<string,string>();

Возможно, можно было и не использовать map<string,string> * Params::_prm = new map<string,string>();
а иннициализировать как-то map статически - но ничего не получилось.

если есть пожелания по улучшению кода, то я с большим удовольствием их приму
всем спасибо.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34892901
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.пример синглетона взят от сюда http://www.codeproject.com/cpp/singletonrvs.asp
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34893331
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.

Мембер map, по-сути, быть статическим мембером быть не должен.

+1
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34893338
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akalend AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.пример синглетона взят от сюда http://www.codeproject.com/cpp/singletonrvs.asp

Так там существование синглетона им и проверяется, а у ты проверяешь указатель. Т.е. ты обошелся без флага.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895347
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh
Так там существование синглетона им и проверяется, а у ты проверяешь указатель. Т.е. ты обошелся без флага.
да, обошелся без флага - уберу.
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895353
akalend
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМембер map, по-сути, быть статическим мембером быть не должен.
а как тогда лучше реализовать.
в конструкторе сделать динамическое размещение?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895392
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
akalend авторМембер map, по-сути, быть статическим мембером быть не должен.
а как тогда лучше реализовать.
в конструкторе сделать динамическое размещение?

Я привел вариант без динамичкой памяти. Вы его смотрели?
...
Рейтинг: 0 / 0
использование map в синглетоне
    #34895666
MacKintosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий Широков
Мембер map, по-сути, быть статическим мембером быть не должен.
Что за суть такая?
С сиглом, правда, разницы особой нет...
Но если и статик - кому это мешает?
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / использование map в синглетоне
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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