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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как произвести инициализацию статического списка/хеша?  (Прочитано 5007 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Ноябрь 12, 2012, 16:29 »

Привет. Как произвести инициализацию статического списка?
т.е. в классе есть статический список строк, где его инициализировать? В начале модуля? Класс в будущем будет размещаться в отдельной динамической либе.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 12, 2012, 17:16 »

Что есть "статический список строк"? Про какие строки идёт речь?
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Ноябрь 12, 2012, 17:26 »

К примеру: есть классы, которые должны реагировать на определенный тип других классов. тип класса у меня записан в строке.
т.е.

class SomeClass
{
public:
virtual const QString & classType() const;
};

В наследниках переопределяются строки, которые возвращаются.

А есть классы, которым передаются на исследование SomeClass, и в зависимости от строки classType() принимает решение, будет он его обрабатывать или нет.
А т.к. SomeClass наследников много, то простым перебором не хочется заниматься, как сейчас сделано

например
Код:
bool itemConformsToThis(const QString & Role, SomeClass * item)
{
 if(item->className()=="..." || item->className()=="...." || ....) return true;
return false;
}

Для каждого класса обработчика внести локальный статический хеш, в который заранее внести строки описатели тех классов, с которыми хотим иметь дело.
т.е. образно

Код:
class ClassWorker
{
private:
static QStringList roles;
}


//где то инициализируем (собственно вопрос где)
Код:
bool itemConformsToThis(const QString & Role, SomeClass * item)
{
return roles.contains(item->classType());
return false;
}
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Ноябрь 12, 2012, 17:29 »

Почему не делаю через dynamic_cast, потому что хочу отойти от этого, разбиваю программу на модель MVC, и что бы классы модель, контроллер и представление общались друг с другом толбько через общий интерфейс описанные в абстрактных классах. плюс для каждого конечного объекта где будет работаь ПО поведение классов и их взаимодествие может различаться, а так посредством плагинов поведение ПО можно изменять. Вот моя цель.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Ноябрь 12, 2012, 17:34 »

Ну, хотя бы так:
Код
C++ (Qt)
class RoleStringList : public QStringList
{
public:
RoleStringList()
{
// add strings here
append( ... );
}
};
 
RoleStringList ClassWorker::roles;
 
Записан

Qt 5.11/4.8.7 (X11/Win)
Akon
Гость
« Ответ #5 : Ноябрь 12, 2012, 19:37 »

Ну, инициализируем чем локальнее, тем лучше, т.е. в bool itemConformsToThis(const QString & Role, SomeClass * item), если только там список и требуется.
Код:
bool itemConformsToThis(const QString & Role, SomeClass * item)
{
  static const QStringList ClassTypes = QStringList() << "Type1" << "Type2" ... ;
}
Статическая константа ClassTypes инициализируется только один раз при первом вызове функции. Ну и implicit sharing QStringLista тут к месту.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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