Russian Qt Forum

Программирование => С/C++ => Тема начата: Fregloin от Ноябрь 12, 2012, 16:29



Название: Как произвести инициализацию статического списка/хеша?
Отправлено: Fregloin от Ноябрь 12, 2012, 16:29
Привет. Как произвести инициализацию статического списка?
т.е. в классе есть статический список строк, где его инициализировать? В начале модуля? Класс в будущем будет размещаться в отдельной динамической либе.


Название: Re: Как произвести инициализацию статического списка/хеша?
Отправлено: GreatSnake от Ноябрь 12, 2012, 17:16
Что есть "статический список строк"? Про какие строки идёт речь?


Название: Re: Как произвести инициализацию статического списка/хеша?
Отправлено: Fregloin от Ноябрь 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;
}


Название: Re: Как произвести инициализацию статического списка/хеша?
Отправлено: Fregloin от Ноябрь 12, 2012, 17:29
Почему не делаю через dynamic_cast, потому что хочу отойти от этого, разбиваю программу на модель MVC, и что бы классы модель, контроллер и представление общались друг с другом толбько через общий интерфейс описанные в абстрактных классах. плюс для каждого конечного объекта где будет работаь ПО поведение классов и их взаимодествие может различаться, а так посредством плагинов поведение ПО можно изменять. Вот моя цель.


Название: Re: Как произвести инициализацию статического списка/хеша?
Отправлено: GreatSnake от Ноябрь 12, 2012, 17:34
Ну, хотя бы так:
Код
C++ (Qt)
class RoleStringList : public QStringList
{
public:
RoleStringList()
{
// add strings here
append( ... );
}
};
 
RoleStringList ClassWorker::roles;
 


Название: Re: Как произвести инициализацию статического списка/хеша?
Отправлено: Akon от Ноябрь 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 тут к месту.