Russian Qt Forum

Qt => Общие вопросы => Тема начата: Fregloin от Июль 03, 2013, 12:30



Название: private static QHash в классе - иницализация и использование
Отправлено: Fregloin от Июль 03, 2013, 12:30
Привет. Нужно использовать статический хеш для класса. Как его инициализировать и использовать?
Сейчас использую статический хеш в функции, с поздней загрузкой, но это получается локальный статичный экзепляр для каждого объекта (таких объектов много)
Код:
void SomeClass::someMethod(somedata)
{
...
static  QHash<QString,FeederState>  feederStateHash;
    if(feederStateHash.isEmpty())
    {
        feederStateHash[valuename_powp_fider_low_u]=fsLowVoltage;
        feederStateHash[valuename_powp_fider_norm_u]=fsNormalVoltage;
        feederStateHash[valuename_powp_fider_high_u]=fsHighVoltage;
        feederStateHash[valuename_powp_fider_faza_u]=fsFazeOffset;
        feederStateHash[valuename_powp_fider_is]=fsPresent;
    }
    FeederState _fstate = feederStateHash.value(value,fsError);
    ...
}
хочется использовать что то типа
Код:
class SomeClass
{
private:
 static QHash<QString,int> fhash;
};

но при таком подходе не получается инициализировать его в методе someMethod, компилятор ругается что хеш не найден...


Название: Re: private static QHash в классе - иницализация и использование
Отправлено: kambala от Июль 03, 2013, 12:57
допиши где-нибудь вне методов QHash<QString,int> SomeClass::fhash; (например перед конструктором)

Сейчас использую статический хеш в функции, с поздней загрузкой, но это получается локальный статичный экзепляр для каждого объекта (таких объектов много)
с чего вдруг? объект будет всего один для всех экземпляров, ведь статическая переменная определяется на уровне файла, а не объекта.


Название: Re: private static QHash в классе - иницализация и использование
Отправлено: Fregloin от Июль 04, 2013, 10:17
как дописать не совсем понял...
по поводу статических переменных - сейчас я использую статические хеши в функциях, а на сколько я понял, статическая переменная в функции создается один раз и хранится отдельно от текущего стека, т.е. результат сохраняется между вызовами функции, а вот является ли она общей для всех классов это вопрос...


Название: Re: private static QHash в классе - иницализация и использование
Отправлено: Old от Июль 04, 2013, 10:54
Не нужно путать классы и объекты.
Является общей для всех объектов - да.


Название: Re: private static QHash в классе - иницализация и использование
Отправлено: kambala от Июль 04, 2013, 12:04
как дописать не совсем понял...
например так
Код
C++ (Qt)
// .cpp
#include...
 
QHash<QString, int> SomeClass::feederStateHash;
 
SomeClass::SomeClass() { ... }
 
void SomeClass::someMethod(somedata)
{
...
   if (feederStateHash.isEmpty())
   {
       feederStateHash[valuename_powp_fider_low_u]=fsLowVoltage;
       feederStateHash[valuename_powp_fider_norm_u]=fsNormalVoltage;
       feederStateHash[valuename_powp_fider_high_u]=fsHighVoltage;
       feederStateHash[valuename_powp_fider_faza_u]=fsFazeOffset;
       feederStateHash[valuename_powp_fider_is]=fsPresent;
   }
   FeederState _fstate = feederStateHash.value(value,fsError);
   ...
}


Название: Re: private static QHash в классе - иницализация и использование
Отправлено: Akon от Июль 04, 2013, 21:28
Код:
// static function in cpp file
static QHash<QString, int> getHash()
{
    QHash<QString, int> feederStateHash;
    feederStateHash[valuename_powp_fider_low_u]=fsLowVoltage;
    feederStateHash[valuename_powp_fider_norm_u]=fsNormalVoltage;
    feederStateHash[valuename_powp_fider_high_u]=fsHighVoltage;
    feederStateHash[valuename_powp_fider_faza_u]=fsFazeOffset;
    feederStateHash[valuename_powp_fider_is]=fsPresent;
    return feederStateHash;
}
 
// static field initialization, called before main()
QHash<QString, int> SomeClass::feederStateHash = getHash();

Если же в getHash() нужны параметры, которые еще не известны до входа в main(), то от статического поля в классе придется отказаться, а использовать метод, возвращающий единственный экземпляр хэша и инициализирующий его при первом обращении. Вариант, когда имеется статическая переменная, которая инициализируется не сразу, считаю плохим.