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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 23:56   #1
Начавший
Пользователь
 
Аватар для Начавший
 
Регистрация: 29.08.2011
Сообщений: 14
Вопрос Копирующий конструктор и абстрактный указатель член класса

Здравствуйте.
Считается что поумолчанию копирующий конструктор выполняет
почленную инициализацию и для корректного копирования обьекта
имеющего в своём составе указатели пишется собственная реализация
коп. конструктора. Короткий пример:

Код:
class A
{
	char *c;
public:
	/*.....*/
	A(A& a);
};

A::A(A &a)
{
	if(this != &a)
	{
		c = new char[strlen(a.c) + 1];
		strcpy(c, a.c);
	}
}
Здесь всё ясно, "содержимое" указателя копируется функцией.
Но как быть если класс содержит указатель на абстрактный класс:

Код:
// Реализация класса Abs недоступна
#include"Abs.h"

class MyClass
{
	Abs* p;
public:
	/*...*/
	MyClass(MyClass& m);// ???
};
Начавший вне форума Ответить с цитированием
Старый 27.06.2012, 00:04   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Начавший
я бы в дереве классов, которому принадлежит класс Abs использовал идиому prototype. погугли, инфы много. с ней твой код будет выглядеть так:
Код:
class MyClass {
	Abs* p;
public:
	MyClass(const MyClass& m)
	{
		...
		p = m.p->clone();
		...
	}
};
у Александреску это называется фабрикой клонирования, у Гаммы - прототипом
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 27.06.2012 в 00:11.
pproger вне форума Ответить с цитированием
Старый 27.06.2012, 00:19   #3
Начавший
Пользователь
 
Аватар для Начавший
 
Регистрация: 29.08.2011
Сообщений: 14
По умолчанию

pproger но если в классе Abs нет "клонирующего" метода, то наверное никак?
Давно где-то читал что new "помнит" сколько было выделено памяти чтобы правильно сработал delete, точно не помню. Вот думаю нельзя ли это как-то использовать. Нет, глупость какая то.
Начавший вне форума Ответить с цитированием
Старый 27.06.2012, 00:25   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Начавший
Цитата:
Давно где-то читал что new "помнит" сколько было выделено памяти чтобы правильно сработал delete, точно не помню. Вот думаю нельзя ли это как-то использовать. Нет, глупость какая то.
да, это глупо.

можно и без clone, используя dynamic_cast (rtti должен быть включен). но это так же не оптимально, затраты на использование rtti + при добавлении нового класса в этом дереве, тебе придется переписать все копирующие конструкторы, добавив в них проверку на новый класс.
без rtti - можно завести enum с идентификаторами классов (каждому классу присвоить целочисленное значение), что так же не избавит от переписывания копирующих конструкторов после добавления нового класса (хотя у того же александреску были всякие извраты для ведения реестра классов, чтобы не переписывать постоянно старый код, но это все же извращение).
прототип - самое правильное решение. причем в проект его ввести не составит труда. в абстрактном классе объявляешь чисто виртуальную функцию clone, в дочерних - переопределяешь, используя ковариантность. внутри clone обычно реализуется просто вызовом конструктора копирования. единственный минус - clone всегда нужно переопределять во вновь созданном классе.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 27.06.2012 в 00:34.
pproger вне форума Ответить с цитированием
Старый 27.06.2012, 00:39   #5
Начавший
Пользователь
 
Аватар для Начавший
 
Регистрация: 29.08.2011
Сообщений: 14
По умолчанию

Получается если использовать стороние библиотеки, в которых идиома прототипов не использовалась, то можно забыть о копирующем конструкторе
Начавший вне форума Ответить с цитированием
Старый 27.06.2012, 00:44   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Начавший
Цитата:
Получается если использовать стороние библиотеки, в которых идиома прототипов не использовалась, то можно забыть о копирующем конструкторе
вообще в нормальной либе должен быть реализовать либо prototype (если нужно клонирование, на Qt посмотри, у всяких итемов он есть), либо использоваться какая-нить метасистема, чтобы можно было узнать, с объектом какого класса мы работаем. на крайний случай должна поддерживать rtti.
пс. что за либа то?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 27.06.2012 в 00:47.
pproger вне форума Ответить с цитированием
Старый 27.06.2012, 00:49   #7
Начавший
Пользователь
 
Аватар для Начавший
 
Регистрация: 29.08.2011
Сообщений: 14
По умолчанию

Не имел в виду конкретную либу. Вопрос чисто теоретический. Спасибо за помощь.
Начавший вне форума Ответить с цитированием
Старый 27.06.2012, 00:50   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Начавший
пффф, теоретический. теоретически либу правильно проектировать надо
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на функцию и функция-член Granus Общие вопросы C/C++ 3 25.08.2011 13:20
Зачем нужен копирующий конструктор? Rekky Общие вопросы C/C++ 3 25.08.2011 13:03
Указатель на абстрактный класс zhenya.ya Общие вопросы C/C++ 0 11.11.2010 23:51
С++ (конструктор, деструктор, копирующий конструктор) Jane-sad Помощь студентам 2 01.10.2010 10:01