Russian Qt Forum

Программирование => С/C++ => Тема начата: Buran от Январь 08, 2011, 01:45



Название: Как выбрать и создать экземпляр нужного класса реал-тайм?
Отправлено: 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() не определены.
Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные?
Но что-то мне подсказывает, что есть более грамотное решение.

Заранее благодарен.


Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм?
Отправлено: Fat-Zer от Январь 08, 2011, 01:59
Код
C++ (Qt)
B* test;
if(cond) test = new B();
else test = new C();
 
Только метод init надо сделать виртуальным, иначе это не имеет смысла...

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


Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм?
Отправлено: Buran от Январь 08, 2011, 16:07
Код
C++ (Qt)
B* test;
if(cond) test = new B();
else test = new C();
 
Только метод init надо сделать виртуальным, иначе это не имеет смысла...

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

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

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


Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм?
Отправлено: Igors от Январь 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();
 
В общем, в учебнике все это есть, поэтому умолкаю  :)


Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм?
Отправлено: brankovic от Январь 08, 2011, 21:36
ЗЫ: Кароче читайте книжки и учите С++ - вообще непонятно к чему...

Почему же, как раз в точку :)

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