Russian Qt Forum

Qt => Общие вопросы => Тема начата: BuRn от Март 03, 2012, 22:39



Название: metaobject()
Отправлено: BuRn от Март 03, 2012, 22:39
Есть ли возможность как в map , получить указатель на объект класса по его имени, без тупо for(int i=0;i<count_obj;i++) ... т.е. что бы не получать имя всех объектов и сравивать со стройкой, хотелось бы получить что - то типа map


Название: Re: metaobject()
Отправлено: BRE от Март 03, 2012, 22:42
QList<T> QObject::findChildren ( const QString & name = QString() ) const


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 22:49
QList<T> QObject::findChildren ( const QString & name = QString() ) const

спасибо , видимо то что нужно...


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 22:51
ммм , а разве в качестве стринга передается не имя объекта ? нужно передаавать имя класса , а не имя объекта, точнее получать по имени класса объект из массива или списка объектов


Название: Re: metaobject()
Отправлено: BRE от Март 03, 2012, 22:54
ммм , а разве в качестве стринга передается не имя объекта ? нужно передаавать имя класса , а не имя объекта, точнее получать по имени класса объект из массива или списка объектов
У тебя есть массив объектов, из него ты хочешь выделить объекты заданного класс?


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 22:58
именно ...
obj->metaObject()->className(); так мы получаем имя класса, а нужно обратная операция , по имени класса получить объект
примерно в текущем контексте что - то типа for(int i=0;i<count;i++){obj->metaObject()->className() == "MyClass") return obj;} вот что - то типа такого , просто объектов несколько и тупо циклом не хочется, хотелось бы как сделано в map
obj = map["MyClass"];


Название: Re: metaobject()
Отправлено: mutineer от Март 03, 2012, 23:02
Так а почему самому указатели на объекты в мапу не засунуть?


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 23:07
ну ищу более лучший вариант. Суть такая, что бы по строку с именем класса преобразовать в класс, начальная суть вообще по имени класса создать объект с таким типом, если делать мап , то в нем нужно уже хранить все объекты


Название: Re: metaobject()
Отправлено: mutineer от Март 03, 2012, 23:10
Ну в список гипотетический (который в твоем примере) ты тоже их должен как-то засунуть


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 23:13
Ну в список гипотетический (который в твоем примере) ты тоже их должен как-то засунуть
а вот в те списки уже придется вручную, просто другого варианта я не вижу , как получить объект того типа , который мы передадим как строку, кроме как создать заранее все объекты и вытаскивать их через какой нибудь map по имени. Нужно впринципе по факту просто преобразовать строку , с именем класса, в объект этого класса
Вот у metaobject есть className но так мы получаем имя класса, а нужна обратная операция


Название: Re: metaobject()
Отправлено: BRE от Март 03, 2012, 23:14
Что-то я запутался, но для этого:
начальная суть вообще по имени класса создать объект с таким типом

можно посмотреть на:
int QMetaType::type ( const char * typeName ) [static]
void * QMetaType::construct ( int type, const void * copy = 0 ) [static]


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 23:18
Это все хорошо конечно , но у нас массив объектов, поэтому нужно проверять в цикле все элементы этого массива, чего не хочется делать, я же писал впринципе className тоже подойдет, только придется тогда проходить по всем элементам массива в цикле и проверять имя каждого на то что мы ищем, вот есть ли варианты без map вытащить по имени класса объект этого типа


Название: Re: metaobject()
Отправлено: mutineer от Март 03, 2012, 23:19
Это все хорошо конечно , но у нас массив объектов, поэтому нужно проверять в цикле все элементы этого массива, чего не хочется делать, я же писал впринципе className тоже подойдет, только придется тогда проходить по всем элементам массива в цикле и проверять имя каждого на то что мы ищем, вот есть ли варианты без map вытащить по имени класса объект этого типа

Блин, окончательно запутал... Так массив объектов есть, или их надо создавать по имени?
Если массив есть, то юзай мапу вместо массива
Если массива нет, а объекты надо создавать, то юзай совет BRE


Название: Re: metaobject()
Отправлено: BRE от Март 03, 2012, 23:20
Брр. Ты как это себе представляешь? Объектов одного класса может быть много, сам класс не сохраняет указатели на свои объекты.
Для своих классов такой функционал можешь добавить сам.


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 23:22
Это все хорошо конечно , но у нас массив объектов, поэтому нужно проверять в цикле все элементы этого массива, чего не хочется делать, я же писал впринципе className тоже подойдет, только придется тогда проходить по всем элементам массива в цикле и проверять имя каждого на то что мы ищем, вот есть ли варианты без map вытащить по имени класса объект этого типа

Блин, окончательно запутал... Так массив объектов есть, или их надо создавать по имени?
Если массив есть, то юзай мапу вместо массива
Если массива нет, а объекты надо создавать, то юзай совет BRE
вообще подразумевается 2 варианта , что лучше пока не решили , хранить все объекты и через map по имени вытаскивать их, либо создавать не лету , конечно 2 вариант лучше


Название: Re: metaobject()
Отправлено: BuRn от Март 03, 2012, 23:49
Что-то я запутался, но для этого:
начальная суть вообще по имени класса создать объект с таким типом

можно посмотреть на:
int QMetaType::type ( const char * typeName ) [static]
void * QMetaType::construct ( int type, const void * copy = 0 ) [static]
но construct возвращает void, все равно не зная имени, а точнее знаем мы его только в виде строки , как преобразовать в нужному непонятно


Название: Re: metaobject()
Отправлено: mutineer от Март 04, 2012, 00:00
но construct возвращает void, все равно не зная имени, а точнее знаем мы его только в виде строки , как преобразовать в нужному непонятно

А указатель, в который ты полученный объект сохранять планируешь, какого типа будет?


Название: Re: metaobject()
Отправлено: BuRn от Март 04, 2012, 00:01
но construct возвращает void, все равно не зная имени, а точнее знаем мы его только в виде строки , как преобразовать в нужному непонятно

А указатель, в который ты полученный объект сохранять планируешь, какого типа будет?
так в том то вся и проблема , хотелось бы тупо со строки QString name="MyClass"; создать объект MyClass a ;к примеру


Название: Re: metaobject()
Отправлено: mutineer от Март 04, 2012, 00:04
как ты собираешься это использовать? предположим ты написал такой метод. И что с ним делать?

????? *pointer = createObjectOfClass("MyClass");

что вместо знаков вопроса писать планируешь?


Название: Re: metaobject()
Отправлено: BuRn от Март 04, 2012, 00:06
как ты собираешься это использовать? предположим ты написал такой метод. И что с ним делать?

????? *pointer = createObjectOfClass("MyClass");

что вместо знаков вопроса писать планируешь?
в этом то вся и проблема


Название: Re: metaobject()
Отправлено: mutineer от Март 04, 2012, 00:08
Боюсь в этом языке задача невозможна именно в таком виде. Разве что пронаследовать всех от одного базового класса (QObject, например) и безусловно кастовать указатель полученный к нему

Ну или может поможет какая-нить жуткая шаблонная магия. Я в ней не особо силен


Название: Re: metaobject()
Отправлено: fuCtor от Март 04, 2012, 12:59
Если правильно понял, то чем-то похоже на IoC: http://qtioccontainer.sourceforge.net/
Еще было решение, QNimbleContainer называлось, тоже вариант реализации IoC, только вот что-то все следы в инете о нем пропали, если интересны будут исходники, могут выложить (на работе сохранилось)


Название: Re: metaobject()
Отправлено: Igors от Март 04, 2012, 14:07
Ну или может поможет какая-нить жуткая шаблонная магия. Я в ней не особо силен
Я (мельком) видел что-то похожее в книге Александреску. Ну типа как клонировать объект или создавать экземпляр без явного указания типа. Может имеет смысл прильнуть к теории.


Название: Re: metaobject()
Отправлено: Sahab от Март 04, 2012, 15:19
Четко сформулировать вопрос еще раз можно?
а то как-то по топику размазана логика.


Название: Re: metaobject()
Отправлено: BuRn от Март 04, 2012, 15:34
Четко сформулировать вопрос еще раз можно?
а то как-то по топику размазана логика.
есть строка , пример :QString name = "MyClass" ; нужно создать класс с типом , который хранится в переменной name, т.е. MyClass


Название: Re: metaobject()
Отправлено: BRE от Март 04, 2012, 15:40
есть строка , пример :QString name = "MyClass" ; нужно создать класс с типом , который хранится в переменной name, т.е. MyClass
Предположим создали, что ты дальше с ним делать планируешь?


Название: Re: metaobject()
Отправлено: BuRn от Март 04, 2012, 15:49
виртуальными методами пользоваться


Название: Re: metaobject()
Отправлено: Sahab от Март 04, 2012, 17:31
Код:
int id = QMetaType::type("MyClass");
QObjectOrDerivedFromQObject* obj = QMetaType::construct ( id );
ну и конечно почитать на тему Q_DECLARE_METATYPE()


Название: Re: metaobject()
Отправлено: BuRn от Март 04, 2012, 17:44
Код:
int id = QMetaType::type("MyClass");
QObjectOrDerivedFromQObject* obj = QMetaType::construct ( id );
ну и конечно почитать на тему Q_DECLARE_METATYPE()
не совсем то ...


Название: Re: metaobject()
Отправлено: BRE от Март 04, 2012, 17:45
не совсем то ...
Почему?


Название: Re: metaobject()
Отправлено: BuRn от Март 04, 2012, 20:05
не совсем то ...
Почему?

так будут создаваться объекты класса родителя , а нужен именно тот который лежит в строке , точнее нужен тот , какое содержание имеет строка


Название: Re: metaobject()
Отправлено: BRE от Март 04, 2012, 20:07
так будут создаваться объекты класса родителя , а нужен именно тот который лежит в строке , точнее нужен тот , какое содержание имеет строка
Почему класса родителя? С чего ты это взял?
Именно тот, который будет лежать в строке, id которого и вернет QMetaType::type.


Название: Re: metaobject()
Отправлено: kambala от Март 04, 2012, 22:37
не совсем то ...
Почему?

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


Название: Re: metaobject()
Отправлено: fuCtor от Март 05, 2012, 06:25
Четко сформулировать вопрос еще раз можно?
а то как-то по топику размазана логика.
есть строка , пример :QString name = "MyClass" ; нужно создать класс с типом , который хранится в переменной name, т.е. MyClass

Такой вариант если:
Код
C++ (Qt)
container->registerType<ITestClass,FirstTestClass>("first");
container->registerType<ITestClass,SecondTestClass>("second");
 
ITestClass* first = container->resolve<ITestClass>("first");
ITestClass* second = container->resolve<ITestClass>("second");
 


Название: Re: metaobject()
Отправлено: m_ax от Март 06, 2012, 13:11
Боюсь в этом языке задача невозможна именно в таком виде. Разве что пронаследовать всех от одного базового класса (QObject, например) и безусловно кастовать указатель полученный к нему

Ну или может поможет какая-нить жуткая шаблонная магия. Я в ней не особо силен

Думаю, что всё же возможно..

Например так:
Код
C++ (Qt)
auto *pointer = createObjectOfClass("MyClass");
 


Название: Re: metaobject()
Отправлено: mutineer от Март 06, 2012, 13:16
Думаю, что всё же возможно..

Например так:
Код
C++ (Qt)
auto *pointer = createObjectOfClass("MyClass");
 

Поправь меня, если я ошибаюсь, но auto работает, когда компилер на этапе компилляции может вывести тип. А в этом случае не сможет


Название: Re: metaobject()
Отправлено: m_ax от Март 06, 2012, 13:35
Думаю, что всё же возможно..

Например так:
Код
C++ (Qt)
auto *pointer = createObjectOfClass("MyClass");
 

Поправь меня, если я ошибаюсь, но auto работает, когда компилер на этапе компилляции может вывести тип. А в этом случае не сможет

Это почему это? Разве компилятор не знает, что вернёт createObjectOfClass("MyClass") ?

Но если нет, то как реализовать функцию, которая может возвращать различные типы? 


Название: Re: metaobject()
Отправлено: mutineer от Март 06, 2012, 13:40
Это почему это? Разве компилятор не знает, что вернёт createObjectOfClass("MyClass") ?

Но если нет, то как реализовать функцию, которая может возвращать различные типы? 

Если компилятор знает, то и кодер знает и может написать:) а так как тут имя класса скорее всего не громоздкое, то смысла от auto очень мало (с тем же успехом можно вместо auto написать ITestClass, как и предалагали несколько раз уже)


Название: Re: metaobject()
Отправлено: m_ax от Март 06, 2012, 14:04
Это почему это? Разве компилятор не знает, что вернёт createObjectOfClass("MyClass") ?

Но если нет, то как реализовать функцию, которая может возвращать различные типы? 

Если компилятор знает, то и кодер знает и может написать:) а так как тут имя класса скорее всего не громоздкое, то смысла от auto очень мало (с тем же успехом можно вместо auto написать ITestClass, как и предалагали несколько раз уже)

Но как вы себе представляете функцию, для которой на этапе компиляции не известно, какой тип она вернёт?


Название: Re: metaobject()
Отправлено: mutineer от Март 06, 2012, 14:05
Это почему это? Разве компилятор не знает, что вернёт createObjectOfClass("MyClass") ?

Но если нет, то как реализовать функцию, которая может возвращать различные типы? 

Если компилятор знает, то и кодер знает и может написать:) а так как тут имя класса скорее всего не громоздкое, то смысла от auto очень мало (с тем же успехом можно вместо auto написать ITestClass, как и предалагали несколько раз уже)

Но как вы себе представляете функцию, для которой на этапе компиляции не известно, какой тип она вернёт?

Это ТС хочет такую функцию, а не я


Название: Re: metaobject()
Отправлено: Sahab от Март 06, 2012, 16:31
ТСу дали внятный ответ. Не высасывайте проблему.


Название: Re: metaobject()
Отправлено: BuRn от Март 06, 2012, 16:36
ребят вы про рефлексию слышали ?
http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D1%8F
http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)


Название: Re: metaobject()
Отправлено: BRE от Март 06, 2012, 17:30
Можно определить интерфейс:
Код
C++ (Qt)
class IFace
{
public:
virtual void method1() = 0;
virtual void method2() = 0;
};
 

На основании этого интерфейса сделать сколько нужно классов, зарегистрировать их с помощью qRegisterMetaType, создавать с помощью QMetaType::construct и использовать:
Код
C++ (Qt)
IFace *objA = static_cast<IFace*>( QMetaType::construct ( QMetaType::type( "ClassA" ) ) );
Q_ASSERT( objA );
objA->method1();
objA->method2();
 
IFace *objB = static_cast<IFace*>( QMetaType::construct ( QMetaType::type( "ClassB" ) ) );
Q_ASSERT( objB );
objB->method1();
objB->method2();
 


Название: Re: metaobject()
Отправлено: Igors от Март 06, 2012, 18:29
ребят вы про рефлексию слышали ?
Слышали, ребятенок. Но здесь всем понятно что С++ не интерпретатор, и некоторые радости недоступны. Напр присвоить переменной "выражение" не вычисляя его - было бы иногда замечательно, но увы :'(  Мне кажется Вам лучше привести пример, можно "от противного" напр чем не устраивает стандартный механизм виртуалов. Да и вообще больше слов, пояснений, а как Вы излагаете - получаете ответы для начинающих - попусту тратите свое и чужое время


Название: Re: metaobject()
Отправлено: Sahab от Март 09, 2012, 14:24
Я у тебя еще раз спрашиваю, какой вопрос?
На то, что ты спросил, дали вменяемый ответ. Не нравятся ответы - подумай о правильной постановке вопроса.