Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / использование map в синглетоне / 25 сообщений из 43, страница 1 из 2
24.10.2007, 17:34:17
    #34892253
akalend
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
компилятор 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
24.10.2007, 17:45:04
    #34892303
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Можно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.
...
Рейтинг: 0 / 0
24.10.2007, 18:08:43
    #34892421
использование map в синглетоне
Код: 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
24.10.2007, 18:13:32
    #34892432
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Сначала надо убрать статический метод класса из хидера в сpp
...
Рейтинг: 0 / 0
24.10.2007, 18:46:37
    #34892559
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Можно, на мой вгляд, прекрасно обойтись без динамической памяти:

Код: 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
24.10.2007, 18:47:21
    #34892562
использование map в синглетоне
blindedСначала надо убрать статический метод класса из хидера в сpp
И что это изменит?
...
Рейтинг: 0 / 0
24.10.2007, 18:49:57
    #34892571
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
blindedСначала надо убрать статический метод класса из хидера в сpp
да он, вроде, не мешает :)
...
Рейтинг: 0 / 0
24.10.2007, 18:51:36
    #34892574
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.

Мембер map, по-сути, быть статическим мембером быть не должен.
...
Рейтинг: 0 / 0
24.10.2007, 19:15:53
    #34892622
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Код: plaintext
1.
2.
3.
4.
      static Params& getInstance() {
             static Params singleton;
             return signleton;
      }
Будет торчать в каждом модуле где инклудится ваш h и в каждом модуле будет свой map
...
Рейтинг: 0 / 0
24.10.2007, 19:20:21
    #34892633
Hryuckinnen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Дался вам этот синглтон... У него же функционала никакого нет, кроме хранения ОДНОГО мапа. Нельзя тупо создать один СТАТИЧЕСКИЙ мап и юзать?
...
Рейтинг: 0 / 0
24.10.2007, 19:27:37
    #34892653
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Изыди! Это модель!
Кстати вон там валяется на скрепке
...
Рейтинг: 0 / 0
24.10.2007, 19:41:38
    #34892704
использование map в синглетоне
И вот это тоже надо, наверное, исправить:
Код: 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
24.10.2007, 21:27:17
    #34892847
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
blinded
Код: plaintext
1.
2.
3.
4.
      static Params& getInstance() {
             static Params singleton;
             return signleton;
      }
Будет торчать в каждом модуле где инклудится ваш h и в каждом модуле будет свой map

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

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

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

Статическая функция и статический метод класс - это две большие разницы. Вы выдимо провели аналогию, а этого делать не стоило.
...
Рейтинг: 0 / 0
24.10.2007, 22:13:39
    #34892899
akalend
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
следал так (временно)
все Ваши пожелания учту и исправлю.
что касается 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
24.10.2007, 22:16:20
    #34892901
akalend
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.пример синглетона взят от сюда http://www.codeproject.com/cpp/singletonrvs.asp
...
Рейтинг: 0 / 0
25.10.2007, 10:07:13
    #34893331
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование map в синглетоне
Анатолий Широков AkhМожно начать с того, что map должна быть статической, далее инициализации static свойств нет, и не понятно зачем instanseFlag.

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

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

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

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


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