Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копия объекта по указателю на его абстрактного ... ... предка 
:(
    Опции темы
stmamont
Дата 7.11.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



Код

class AbstractClass
{
  virtual f() = 0;
  int x;
}

class ChildClass
{
  virtual f();
}


Код

...
AbstractClass *n = ...->getModule();



как мне теперь создать копию n?
Так что бы работала функция f. 

В классе ChildClass гарантированно только бывшие виртульные методы.

.туплю.


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 7.11.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Во первых, корректно укажите описание классов. Например AbstractClass и ChildClass никак не связаны. И что такое getModule() ?

Добавлено @ 13:43 
Кстати
Цитата(stmamont @  7.11.2006,  13:33 Найти цитируемый пост)
В классе ChildClass гарантированно только бывшие виртульные методы.

Что такое "бывшие виртуальные методы"? 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
FFFFFFF7
Дата 7.11.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.10.2006

Репутация: 2
Всего: 2



А че конструктор не описал? Хоть и не обязательно...
Цитата(stmamont @  7.11.2006,  13:33 Найти цитируемый пост)
как мне теперь создать копию n?

В общем случае нужно начитнать с:
AbstractClass *n = new AbstractClass;

--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Damarus
Дата 7.11.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



Цитата(FFFFFFF7 @  7.11.2006,  14:40 Найти цитируемый пост)
В общем случае нужно начитнать с:AbstractClass *n = new AbstractClass;

Ты вообще думаешь, когда пишешь smile Нельзя создать экземпляр абстрактного класса.
PM MAIL ICQ Jabber   Вверх
FFFFFFF7
Дата 7.11.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.10.2006

Репутация: 2
Всего: 2



ой #ля smile //опростоволосился smile 
Да, конечно. В таком случае строим производный класс, и уже от него порождаем.
Цитата(Damarus @  7.11.2006,  15:13 Найти цитируемый пост)
ы вообще думаешь, когда пишешь

всегда. Просто бываю невнимательным
Damarus, спс, что поправил
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Yra
Дата 7.11.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 12.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Damarus, точно! создать объект обстрактного класс нельзя!
stmamont, ты бы указал наследника!
PM MAIL   Вверх
stmamont
Дата 8.11.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



извиняюсь за кривую формулировку.
Сейчас попытаюсь снова.  укажу как я это разрешил.

Код

class AbstractClass
{
  AbstractClass();
  virtual f() = 0;
  int x;
};

class ChildClass1: public AbstractClass
{
  ChildClass1();
  virtual f();
};

class ChildClass2: public AbstractClass
{
  ChildClass2();
  virtual f();
};
....

У класса AbstractClass куча потомков. имен которых я не знаю. => я не могу создать экземпляр потомка.
В AbstractClass определены такие свойства как списки из STL.

В любом потомке. 100% нет новых свойств. Нет новых методов. Только определеныые виртуальные методы.

Задача.
Дано:
Указатель на AbstractClass (хотя на самом деле там лежит какой то потомок, но какой я не знаю, и знать мне не надо)
Требуется:
Создать полную копию класса.
Мое решение:
Код

class AbstractClass
{
  AbstractClass();
  virtual f() = 0;
  virtual AbstractClass *getCopy() = 0;
  CopyProperties(AbstractClass *Cl);  // копирует всю инфу из this в Cl
  int x;
};

class ChildClass1: public AbstractClass
{
  ChildClass1();
  virtual f();
  virtual AbstractClass *getCopy();

};

ChildClass1::getCopy()
{
  ChildClass1 *newCC = new ChildClass1();
  // копируем данные из класса в класс 
  copyProperties();
  return newCC;
}



единственная загвоздка, так это то что такую функцию пришлось написать для каждого потомка AbstractClass...


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 8.11.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ну теперь более-менее. 
Проблема в том, что виртуальных конструкторов в С++ нет. Поэтому задача в лоб не решается. Вам нужно посмотреть  паттерн "Абстрактная фабрика"
Как вариант, могу предложить следующее
Код

#include <iostream>


class AbstractClass
{
  public:
  AbstractClass(){}
  AbstractClass( const AbstractClass& source):x(source.x){}
  virtual void f() = 0;
  virtual AbstractClass* getCopy()
  {
        return NULL;
   }
  int x;
};


class ChildClass1: public AbstractClass
{
  public:
  ChildClass1(){}
  ChildClass1( const ChildClass1& source):AbstractClass(source), y(source.y){}
  void f(){};
  AbstractClass *getCopy(){
     return new ChildClass1(*this);
  }
  int y;

};


int main(int argc, char* argv[])
{
   ChildClass1 class1;
   class1.x = 5;
   class1.y = 6;
   AbstractClass* source = &class1;
   AbstractClass* copy = source->getCopy();
   ChildClass1* pclass1 = dynamic_cast<ChildClass1*>( copy);
   std::cout << "copy->x=" <<  pclass1->x << std::endl;
   std::cout << "copy->y=" <<  pclass1->y << std::endl;

    return 0;
}
//---------------------------------------------------------------------------
 
 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
stmamont
Дата 8.11.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



Vyacheslav, ну именно так я и сделал, только без конструктора копирования.
А можно подробнее по поводу паттернов? и где можно почитать?


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 8.11.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Кстати тут как раз придутся к месту макросы, спор о которых зашел в сосоеднем топике
Тогда производные классы будут выглядеть так
Код

#define GET_COPY( CLS ) \
AbstractClass *getCopy(){ return new CLS (*this); }
#define COPY_CONSTRUCTOR(DERIVED,ANCESTOR ) \
     DERIVED( const DERIVED& source):ANCESTOR(source)

class ChildClass1: public AbstractClass
{
  public:
  ChildClass1(){}
  COPY_CONSTRUCTOR(ChildClass1, AbstractClass),  y(source.y){}
  void f(){};
  GET_COPY(  ChildClass1 )
  int y;

};


 class ChildClass2: public ChildClass1
{
  public:
  ChildClass2(){}
  COPY_CONSTRUCTOR(ChildClass2, ChildClass1),  z(source.z){}
  void f(){};
  GET_COPY(  ChildClass2 )
  int z;

};


Добавлено @ 16:24 
Ну для начала здесь
http://forum.vingrad.ru/topic-9713/hl/%D0%...0%B2/index.html

http://forum.vingrad.ru/topic-12645/unread...0%B2/index.html


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1405 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.