Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2012, 01:29   #1
mir_zol
 
Регистрация: 03.12.2012
Сообщений: 8
Вопрос создание объекта произвольного класса по указателю на базовый класс(Visual C++)

Есть некий абстрактный базовый класс . Мы знаем , что от этого базового класса будет образовано несколько конкретных производных классов .Они будут реализововаться отдельно(про них мы ничего не знаем и с ними работать не можем ) .Нужно написать функцию , которая получает указатель на базовый класс (которому указывает на один из наших производный ) , и создает объект производного класса ,а затем возвращает указатель на базовый класс которому присвоен производный .
Пробовал через шаблоны , не получилось , может быть что-нибудь не так сделал , думаю нельзя ли как то это реализовать с помощью typeid , в частности нельзя ли как-то имея type_info создать объект этого класса.[/B]
mir_zol вне форума Ответить с цитированием
Старый 03.12.2012, 06:35   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Такое?
http://ideone.com/CXoC1p
netrino вне форума Ответить с цитированием
Старый 03.12.2012, 15:47   #3
mir_zol
 
Регистрация: 03.12.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Склоняюсь к этому варианту , но лучше было бы как-нибудь так
Код:
class A {
public:
  virtual void report() const {
    std::cout << "A" << std::endl;
  }
 
  A *instance()
{//код функции 
} ;
};
и после этого в классе B уже ничего не надо дописывать , достаточно вызвать функцию из класса А , и она создаст объект класса В , но гложут меня смутные сомнения , что такую функцию написать невозможно( .
mir_zol вне форума Ответить с цитированием
Старый 03.12.2012, 16:36   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

То, что вам предложил netrino это такая функция и есть - вызывается из класса А а создает класс В. Другое дело, что надо самому писать, но это не так уж и сложно а и все нужное можно закатать в макрос.
waleri вне форума Ответить с цитированием
Старый 03.12.2012, 21:37   #5
mir_zol
 
Регистрация: 03.12.2012
Сообщений: 8
По умолчанию

нет вы меня не так понимаете , то что объяснил нитрино я могу осуществить , но если попытаться объяснить на примере , то как предлагает нетрино , это например я отдаю кому-то свой базовый класс , говорю , вот можем образовывать он него наследников , вот такие функции в нем будут гарантировано работать , а вот чтобы работала функция такая та , тебе надо написать в производном классе другую функцию , с такой-то сигнатурой , которая делает то-то , а я хочу я отдаю свой базовый класс и все , в наследниках ничего для обеспечения работы функций базового класса не надо дописывать . То есть
Код:
class A {
public:
  virtual void report() const {
    std::cout << "A" << std::endl;
  }
 
  virtual A *instance() const {
    return new A;
  }
};
 
class B : public A {
public:
  virtual void report() const {
    std::cout << "B" << std::endl;
  }
 
  B *instance() const {
    return new B;// мы вынуждены определить эту функцию для корректной работы , лучше если все без этого будет работать
  }
};
mir_zol вне форума Ответить с цитированием
Старый 03.12.2012, 22:24   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Пример, который я привёл, показывает реализацию на тривиальном примере. Но! Если дело дойдёт до хоть сколько-нибудь близкого к реальности кода, то обнаружится, что у производных классов будут поля, которых нет у базового. Как следствие, чтобы сконструировать корректный объект, необходимо передать определённые параметры в конструктор, о которых базовый класс знать не будет. То есть в любом случае, корректно себя сконструировать может только производный класс, это его обязанность и именно ему и нужно её оставить.

В принципе, можно сделать шаблон, который для каждого наследуемого от него класса будет генерировать
Код:
A *instance() const {
  return new D;
}
Но, снова, проблема с правильным вызовом конструктора. Вероятно, Вам следует пересмотреть необходимость иерархии классов в Вашем проекте. Быть может, если бы Вы описали проблему, которую пытаетесь решить подобным образом более конкретно, то Вам бы могли порекомендовать что-то более подходящее?
http://ideone.com/d4CGtv
netrino вне форума Ответить с цитированием
Старый 03.12.2012, 22:34   #7
mir_zol
 
Регистрация: 03.12.2012
Сообщений: 8
По умолчанию

Спасибо , последний вариант мне подходит , спасибо большое .
mir_zol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание объекта класса KyJIJIEP Visual C++ 3 20.09.2012 01:29
Создание объекта класса в WinMain Стремящийся Win Api 5 10.03.2012 19:01
[Java] Создание объекта внутри объекта этогоже класса. Svarogich Помощь студентам 2 01.08.2011 16:03
как удалить объект по указателю на его базовый класс? AndreyBS Общие вопросы C/C++ 5 17.04.2011 11:29
Создание объекта класса Serjuk Помощь студентам 1 23.05.2010 19:30