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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрещение копировать объект в базовом классе 
V
    Опции темы
SABROG
Дата 21.7.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Есть базовый класс в сторонней библиотеке (т.е. я не могу менять её). В этом классе спецом переопределены конструкторы копирования и вынесены в private секцию. Т.е. вырублено копирование объектов, а при попытке это сделать ругается компилятор на доступ в приватную секцию.

У меня есть класс на базе класса из сторонней библиотеки. Я хочу добавить в него функционал копирования объекта, но из-за базового класса это не получается. Я переопределил конструктор копирования в своем классе, но предположим что у меня слишком много полей, чтобы вручную прописывать присваивание. Как я могу из переопределенного конструктора копирования вызвать оригинальный конструктор копирования только лишь для своего класса, а для базового не вызывать ?

Если делать так, то я получаю рекурсию вплоть до AV:
Код

class A : B
{
    A(){};
    ~A(){};
    A(const A &cls)
    {
        ...
        A(cls);
    }
};




--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
jonie
Дата 21.7.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



код который ты привел тоже тебе не даст ничего. он весь private.

вот этого я непонял:
Цитата

Как я могу из переопределенного конструктора копирования вызвать оригинальный конструктор копирования (который в невашем классе и private ? тогда никак)  только лишь для своего класса, а для базового не вызывать ?


используйте агрегирование, а не наследование. и в своем конструкторе копирования (и про operator= не забывайте тоже) создавайте новый объект класса, что некопируется. и заполняйте его поля...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
SABROG
Дата 21.7.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(jonie @  21.7.2008,  15:05 Найти цитируемый пост)
код который ты привел тоже тебе не даст ничего. он весь private.


Забыл public указать.

Что есть суть агрегирование ? Т.е. выходит если я переопределил конструктор копирования, то оригинальный обработчик теряется и его никак не вызвать ?

Насчет нового объекта некопируемого класса это понятно, я не хочу перечислять все поля класса и присваивать ручками значения, хочу оригинальный конструктор копирования вызвать в переопределенном, но лишь для потомка.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 21.7.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  21.7.2008,  14:54 Найти цитируемый пост)
, но предположим что у меня слишком много полей, чтобы вручную прописывать присваивание

Цитата(SABROG @  21.7.2008,  15:19 Найти цитируемый пост)
Т.е. выходит если я переопределил конструктор копирования, то оригинальный обработчик теряется и его никак не вызвать ?


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

например так:

Код

class NonCopyAble
{
  private:  NonCopyAble (const  NonCopyAble& ) {};
};

class CopyAbleAgain : public NonCopyAble 
{
   public:  CopyAbleAgain( const  CopyAbleAgain& rhs) {// код по ручному копированию класса NonCopyAble..};
};

class A : public CopyAbleAgain // теперь  может использовать конструктор по умолчанию
{
  private: 
  int m_i1, m_i2, m_i3, m_i4; // условная  куча переменных/ полей
};

// P.S
class A 
{
 private: 
   CopyAbleAgain obj; // такая компоновка называется агрегация
};



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


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Спасибо, интересные варианты.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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