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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: metaobject()  (Прочитано 20147 раз)
BuRn
Гость
« Ответ #30 : Март 04, 2012, 20:05 »

не совсем то ...
Почему?

так будут создаваться объекты класса родителя , а нужен именно тот который лежит в строке , точнее нужен тот , какое содержание имеет строка
Записан
BRE
Гость
« Ответ #31 : Март 04, 2012, 20:07 »

так будут создаваться объекты класса родителя , а нужен именно тот который лежит в строке , точнее нужен тот , какое содержание имеет строка
Почему класса родителя? С чего ты это взял?
Именно тот, который будет лежать в строке, id которого и вернет QMetaType::type.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #32 : Март 04, 2012, 22:37 »

не совсем то ...
Почему?

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

Изучением 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
fuCtor
Гость
« Ответ #33 : Март 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");
 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #34 : Март 06, 2012, 13:11 »

Боюсь в этом языке задача невозможна именно в таком виде. Разве что пронаследовать всех от одного базового класса (QObject, например) и безусловно кастовать указатель полученный к нему

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

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
mutineer
Гость
« Ответ #35 : Март 06, 2012, 13:16 »

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

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

Поправь меня, если я ошибаюсь, но auto работает, когда компилер на этапе компилляции может вывести тип. А в этом случае не сможет
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #36 : Март 06, 2012, 13:35 »

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

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

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

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
mutineer
Гость
« Ответ #37 : Март 06, 2012, 13:40 »

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

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

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

Сообщений: 2095



Просмотр профиля
« Ответ #38 : Март 06, 2012, 14:04 »

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

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

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

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
mutineer
Гость
« Ответ #39 : Март 06, 2012, 14:05 »

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

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

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

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

Это ТС хочет такую функцию, а не я
Записан
Sahab
Гость
« Ответ #40 : Март 06, 2012, 16:31 »

ТСу дали внятный ответ. Не высасывайте проблему.
Записан
BuRn
Гость
« Ответ #41 : Март 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)
Записан
BRE
Гость
« Ответ #42 : Март 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();
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Март 06, 2012, 18:29 »

ребят вы про рефлексию слышали ?
Слышали, ребятенок. Но здесь всем понятно что С++ не интерпретатор, и некоторые радости недоступны. Напр присвоить переменной "выражение" не вычисляя его - было бы иногда замечательно, но увы Плачущий  Мне кажется Вам лучше привести пример, можно "от противного" напр чем не устраивает стандартный механизм виртуалов. Да и вообще больше слов, пояснений, а как Вы излагаете - получаете ответы для начинающих - попусту тратите свое и чужое время
Записан
Sahab
Гость
« Ответ #44 : Март 09, 2012, 14:24 »

Я у тебя еще раз спрашиваю, какой вопрос?
На то, что ты спросил, дали вменяемый ответ. Не нравятся ответы - подумай о правильной постановке вопроса.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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