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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как выбрать и создать экземпляр нужного класса реал-тайм?  (Прочитано 2917 раз)
Buran
Гость
« : Январь 08, 2011, 01:45 »

Здрасьте.

Создал классы хочу на этапе выполнения (в зависимости от выбранного в меню) создавать объект определенного класса.
Однако на этапе компиляции вываливаются ошибки. Что впрочем разумно.

Есть ощущение, что должно быть типовое решение для таких случаев.

Пример:
Создал иерархию классов

class A : public QObject
{
public:
   A();
}

class B : public A
{
public:
   B();
   init();
}

class C : public B
{
public:
   C();
   init();
   print();
}

Далее в коде хочу создать экземпляр нужного класса в зависимости от выбранного в меню:

if(true) B* test = new B();
else if(false) C* test = new C();

test->init(); // вываливается ошибка, что мол он про test ничего не знает.

Попытка задать ему сначала базовый класс, чтобы затем притянуть через cast к нужному - тоже с ошибкой, что мол там init() не определены.
Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные?
Но что-то мне подсказывает, что есть более грамотное решение.

Заранее благодарен.
Записан
Fat-Zer
Гость
« Ответ #1 : Январь 08, 2011, 01:59 »

Код
C++ (Qt)
B* test;
if(cond) test = new B();
else test = new C();
 
Только метод init надо сделать виртуальным, иначе это не имеет смысла...

Кароче читайте книжки и учите С++  Подмигивающий
ЗЫ: ещё если от QObject наследуете не забывайте далать конструктор от указателя на родителя и ставить макрос Q_OBJECT
« Последнее редактирование: Январь 08, 2011, 02:05 от Fat-Zer » Записан
Buran
Гость
« Ответ #2 : Январь 08, 2011, 16:07 »

Код
C++ (Qt)
B* test;
if(cond) test = new B();
else test = new C();
 
Только метод init надо сделать виртуальным, иначе это не имеет смысла...

Кароче читайте книжки и учите С++  Подмигивающий
ЗЫ: ещё если от QObject наследуете не забывайте далать конструктор от указателя на родителя и ставить макрос Q_OBJECT

Предложенный Вами вариант мною был описан вот в этой строке: Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные?
Имелся ввиду более широкий смысл, так если вдруг в встретится метод отсутствующий в базовом классе все будет поламато. И спрашивал я о том есть ли какое-нить более стандартное и грамотное решение, чем описанное мной.

ЗЫ: Кароче читайте книжки и учите С++ - вообще непонятно к чему...
« Последнее редактирование: Январь 08, 2011, 16:09 от Buran » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 08, 2011, 16:29 »

if(true) B* test = new B();
else if(false) C* test = new C();

test->init(); // вываливается ошибка, что мол он про test ничего не знает.
Да, т.к. область видимости test закончилась (он существует только в плече if)

Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные?
Нужно, но не все возможные а те что собираетесь пользовать и перекрывать, напр init()

Имелся ввиду более широкий смысл, так если вдруг в встретится метод отсутствующий в базовом классе все будет поламато.
Пример

Код
C++ (Qt)
B * test = 0;
test = new C();
test->init();
 
При виртуальном init будет вызван C::init(). Если у С нет своего init, то будет вызван B::init(), т.к. C наследует B.Но компилятор  не позволит вызвать метод C которого нет у B, т.к. test объявлен как указатель на B. Если такая (подозрительная) необходимость возникла, надо привестись

Код
C++ (Qt)
C * testC = dynamic_cast <C *> (test);
if (testC)
testC->MethodC();
 
В общем, в учебнике все это есть, поэтому умолкаю  Улыбающийся
Записан
brankovic
Гость
« Ответ #4 : Январь 08, 2011, 21:36 »

ЗЫ: Кароче читайте книжки и учите С++ - вообще непонятно к чему...

Почему же, как раз в точку Улыбающийся

Просто вы задаёте несколько вопросов в одном, лучше бы загуглить какой-нибудь туториал простой, а потом спрашивать (без всякой иронии говорю). В частности ответ Fat-Zer вы неправильно поняли.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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