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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: metaobject()  (Прочитано 21052 раз)
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.052 секунд. Запросов: 19.