Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конструктор копирования в абстрактном классе, стек 
V
    Опции темы
mes
Дата 14.12.2008, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(BSOD @  14.12.2008,  22:31 Найти цитируемый пост)
Эммм, а кстати да, как вариант... но всеравно, придется немного, да подправить базовый класс.. 

a foreach что принимает ?? 


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 14.12.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

struct B
{
    virtual B *Clone() = 0;
};

struct D1: public B
{
    int d1;
    virtual D1 *Clone() {
        return new D1(*this);
    }
};

struct D2: public B
{
    int d2;
    virtual D2 *Clone() {
        return new D2(*this);
    }
};



--------------------
user posted image
PM MAIL   Вверх
BSOD
Дата 14.12.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

  virtual B *Clone() = 0;

а в потомке уже
Код

 virtual D1 *Clone()

а так нельзя, получится, что нет реализации чисто виртуальной функции в классе потомке ;) Это как бы было первое, что все пробовали, после чего эта проблема и обнаружилась ;)

Добавлено через 34 секунды
Цитата

a foreach что принимает ??  

Указатель на функцию


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
J0ker
Дата 14.12.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(BSOD @  14.12.2008,  23:08 Найти цитируемый пост)
а так нельзя, получится, что нет реализации чисто виртуальной функции в классе потомке ;) Это как бы было первое, что все пробовали, после чего эта проблема и обнаружилась ;)

можно
перегруженная переопределенная функция может возвращать указатель или ссылку на потомков/предков возвращаемого оригинала

Это сообщение отредактировал(а) J0ker - 15.12.2008, 00:31


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 14.12.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(J0ker @  14.12.2008,  23:27 Найти цитируемый пост)
можно
перегруженная функция может возвращать указатель или ссылку на потомков/предков возвращаемого оригинала 


BSOD, мне кажется, имел ввиду что при такой конструкции не получится сделать следующее : 
Код

D1 d1;
D2 d2;
d1=d2;


Добавлено @ 23:35
думаю подойдет такой вот насбросок: 
Код



class IStack
{
   public: 
       void CopyFrom (const IStack&) ; // лучше если не член класса. 
       virtual void ForEach (IOperation& ) const =0 
       virtual void PushBack (int) =0;

class IOperation 
{
    public :
      virtual void operator () (int);
};  
};

class CPushBackInStack: public IStack::IOperation
{
  public:
    CCopyStack (IStack *dst) : p_stack(dst) {}
     virtual void operator () (int i)  { p_stack->PushBack (i); };

   private:
     IStack * p_stack;
};

void IStack::CopyFrom (const IStack& src) 
{
   CPushBackInStack op(this); src.ForEach (op);
}



Это сообщение отредактировал(а) mes - 15.12.2008, 00:10


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 14.12.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  14.12.2008,  23:33 Найти цитируемый пост)
BSOD, мне кажется, имел ввиду что при такой конструкции не получится сделать следующее : 
Выделить всёкод C++
1:
2:
3:
    
D1 d1;
D2 d2;
d1=d2;

такое и не должно получаться, если D1 и D2 не являются ковариантами
для таких присвоений надо делать либо оператор преобразования типов либо специальный оператор=

Добавлено через 2 минуты и 19 секунд
Цитата(mes @  14.12.2008,  23:33 Найти цитируемый пост)
думаю подойдет такой вот насбросок: 

функцию копирования лучше делать внешней и темплетной - как и сделано в STL
непонятно, зачем изобретать велосипед


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 15.12.2008, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(J0ker @  14.12.2008,  23:44 Найти цитируемый пост)
такое и не должно получаться, если D1 и D2 не являются ковариантами
для таких присвоений надо делать либо оператор преобразования типов либо специальный оператор=

ну да я сильно упростил, так будет точнее 
Код

d1.CopyFrom (d2);


Цитата(J0ker @  14.12.2008,  23:44 Найти цитируемый пост)
функцию копирования лучше делать внешней и темплетной - как и сделано в STL

согласен...но в классе я оставил ee специально для демонстрации,  мне показалось так для тс будет яснее подходит ли ему такой способ или нет,
а сама функция фактически и не нужна (только как оболочка), всю реализацию несет на себе функтор .

Цитата(J0ker @  14.12.2008,  23:44 Найти цитируемый пост)
непонятно, зачем изобретать велосипед 

как понял для сессии.  smile 

Это сообщение отредактировал(а) mes - 15.12.2008, 00:10


--------------------
PM MAIL WWW   Вверх
BSOD
Дата 15.12.2008, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

можно
перегруженная функция может возвращать указатель или ссылку на потомков/предков возвращаемого оригинала

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

Цитата

думаю подойдет такой вот насбросок: 

Ну вот это я думаю прокатит, но я вроде бы как-то ужн реализовал, сейчас буду смотреть, что получилось smile

Добавлено через 6 минут и 13 секунд
Цитата

ну да я сильно упростил, так будет точнее код C++
1:
  d1.CopyFrom (d2);

ну на самом деле наверное нужно было 
Код

B * p1 = new D1();
B * p2 = new D2();
p1->CopyFrom(D2);

;)

Цитата

как понял для сессии.  

Что-то типа того smile


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
mes
Дата 15.12.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(BSOD @  15.12.2008,  00:16 Найти цитируемый пост)
прост мы же получается не перегрузим функцию из родителя а введем новую. А т.к. в родителе наша функция чисто виртуальная, то компилер будет ругаться, что мы не ее не перегрузили в потомке.

А Вы попробуйте и будете сильно удивлены  smile 
Только такая технология позволяет только клонирование, но не копирование объекта от потомка к  потомку другого типа.  smile 


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 15.12.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(BSOD @  15.12.2008,  00:16 Найти цитируемый пост)
прост мы же получается не перегрузим функцию из родителя а введем новую

нет, мы именно перегрузим переопределим

Цитата(BSOD @  15.12.2008,  00:16 Найти цитируемый пост)
то компилер будет ругаться,

не будет

Это сообщение отредактировал(а) J0ker - 15.12.2008, 00:32


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 15.12.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



...

Это сообщение отредактировал(а) mes - 15.12.2008, 00:30


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 15.12.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вы меня запутали млин
не перегрузка конечно, а переопределение


--------------------
user posted image
PM MAIL   Вверх
BSOD
Дата 15.12.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А Вы попробуйте и будете сильно удивлены  smile 
Только такая технология позволяет только клонирование, но не копирование объекта от потомка к  потомку другого типа.  smile  


Сорри, немного не досмотрел, так действительно должно работать smile
Сделал почти так, только Клон ничего не возвращает, а в него передается ссылка на другой стек, куда он себя и копирует smile

Всем спасибо, вопрос вроде как исчерпан smile


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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