Название: Как выбрать и создать экземпляр нужного класса реал-тайм? Отправлено: 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 Код Только метод init надо сделать виртуальным, иначе это не имеет смысла... Кароче читайте книжки и учите С++ ;) ЗЫ: ещё если от QObject наследуете не забывайте далать конструктор от указателя на родителя и ставить макрос Q_OBJECT Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм? Отправлено: Buran от Январь 08, 2011, 16:07 Код Только метод init надо сделать виртуальным, иначе это не имеет смысла... Кароче читайте книжки и учите С++ ;) ЗЫ: ещё если от QObject наследуете не забывайте далать конструктор от указателя на родителя и ставить макрос Q_OBJECT Предложенный Вами вариант мною был описан вот в этой строке: Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные? Имелся ввиду более широкий смысл, так если вдруг в встретится метод отсутствующий в базовом классе все будет поламато. И спрашивал я о том есть ли какое-нить более стандартное и грамотное решение, чем описанное мной. ЗЫ: Кароче читайте книжки и учите С++ - вообще непонятно к чему... Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм? Отправлено: Igors от Январь 08, 2011, 16:29 if(true) B* test = new B(); Да, т.к. область видимости test закончилась (он существует только в плече if)else if(false) C* test = new C(); test->init(); // вываливается ошибка, что мол он про test ничего не знает. Может нужно в базовом классе прописывать ввсе возможные методы производных как виртуальные? Нужно, но не все возможные а те что собираетесь пользовать и перекрывать, напр init() Имелся ввиду более широкий смысл, так если вдруг в встретится метод отсутствующий в базовом классе все будет поламато. ПримерКод При виртуальном init будет вызван C::init(). Если у С нет своего init, то будет вызван B::init(), т.к. C наследует B.Но компилятор не позволит вызвать метод C которого нет у B, т.к. test объявлен как указатель на B. Если такая (подозрительная) необходимость возникла, надо привестись Код В общем, в учебнике все это есть, поэтому умолкаю :) Название: Re: Как выбрать и создать экземпляр нужного класса реал-тайм? Отправлено: brankovic от Январь 08, 2011, 21:36 ЗЫ: Кароче читайте книжки и учите С++ - вообще непонятно к чему... Почему же, как раз в точку :) Просто вы задаёте несколько вопросов в одном, лучше бы загуглить какой-нибудь туториал простой, а потом спрашивать (без всякой иронии говорю). В частности ответ Fat-Zer вы неправильно поняли. |