Russian Qt Forum
Ноябрь 23, 2024, 10:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: private static QHash в классе - иницализация и использование  (Прочитано 4523 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Июль 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, компилятор ругается что хеш не найден...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 03, 2013, 12:57 »

допиши где-нибудь вне методов QHash<QString,int> SomeClass::fhash; (например перед конструктором)

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Июль 04, 2013, 10:17 »

как дописать не совсем понял...
по поводу статических переменных - сейчас я использую статические хеши в функциях, а на сколько я понял, статическая переменная в функции создается один раз и хранится отдельно от текущего стека, т.е. результат сохраняется между вызовами функции, а вот является ли она общей для всех классов это вопрос...
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июль 04, 2013, 10:54 »

Не нужно путать классы и объекты.
Является общей для всех объектов - да.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Июль 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);
   ...
}
« Последнее редактирование: Июль 04, 2013, 12:23 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Akon
Гость
« Ответ #5 : Июль 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(), то от статического поля в классе придется отказаться, а использовать метод, возвращающий единственный экземпляр хэша и инициализирующий его при первом обращении. Вариант, когда имеется статическая переменная, которая инициализируется не сразу, считаю плохим.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 23.