Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование конструктора копирования  (Прочитано 6844 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
kds
Гость
« : 11-05-2008 15:31 » 

Здравствуйте! Подскажите, пожалуйста, как правильно записать параметр в данном случае:
Код:
class tA {
   int i;
public:
   tA (int ii=0) {i=ii;}
   tA (const tA &a) { i=a.i; }
};

class tB: public tA {
   int j;
public:
   tB (int ii=0, int jj=0) : tA (ii) {j=jj;}
   tB (const tB &b) : tA (b) { j=b.j: }
};

class tC {
   int x;
   tA *mas;
public:
   tC (xx=0) {
      x=xx;
      if (x==0) {
         mas = new tA();
      } else {
         mas = new tB():
      }
   }
   tC (const tC &c) {
      x=c.x;
      if (x==0) {
         mas = new tA([b]c.mas[/b]);
      } else {
         mas = new tB([b]c.mas[/b]):
      }     
   }
}

Нужно, чтобы создалась копия объекта и никак не могу понять как записать параметр... Жаль

Заранее всем спасибо!
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 11-05-2008 15:55 » 

Код:
class tA {
   int i;
public:
   tA (int ii=0) {i=ii;}
   tA (const tA &a) { i=a.i; }
};

class tB: public tA {
   int j;
public:
   tB (int ii=0, int jj=0) : tA (ii) {j=jj;}
   tB (const tB &b) : tA (b) { j=b.j; }
};

class tC
{
   int x;
   tA *mas;
public:
   tC (int xx=0)
   {
      x=xx;
      if (x==0) {
         mas = new tA();
      } else {
         mas = new tB();
      }
   }
   tC (const tC &c)
   {
      x=c.x;
      if (x==0) {
         mas = new tA(*c.mas);
      } else {
         mas = new tB(*(static_cast<tB *>(c.mas)));
      }     
   }
};
По крайней мере у меня компилируется.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
kds
Гость
« Ответ #2 : 11-05-2008 16:06 » 

Разобрался, что корректно писать
Код:
mas = new tB (*c.mas);

но теперь компилятор ругается:
Цитата
cannot convert parameter 1 from 'tA' to 'const tB &'

Что делать с этим не знаю Жаль
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 11-05-2008 16:07 » 

kds, Смотри мой код, нужно приводить к типу.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
kds
Гость
« Ответ #4 : 11-05-2008 16:26 » 

Вроде разобрался
Код:
      if (x==0) {
         mas = new tA();
      } else {
         mas = new tB();
      }
     *mas = *c.mas

И конструкторы копирвоания у tA и tB не нужны!

Поправиьте, пожалуйста, если в чем-то не прав!
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #5 : 17-05-2008 12:13 » 

to Finch

Ты вот это
Код:
mas = new tB(*(static_cast<tB *>(c.mas)));
на каком основании делаешь? Где гарантия, что c.mas ссылается реально на объект tB, а не на tA (берем общий случай, а не жестко тот код, что написан, где все слены классов приватные и доступа к ним нет никаго, даже косвенного)?

to kds
Код:
      if (x==0) {
         mas = new tA();
      } else {
         mas = new tB();
      }
     *mas = *c.mas
В общем случае так делать нельзя, проблема та же что и у Finch. Дело вот в чем, если c.mas ссылается на объект типа tA, И так случается, что x НЕ равен 0, то тут *mas = *c.mas будут проблемы (в твоем случае j у нового объекта mas типа tB будет иметь случйное значение).

Все написанное выше относится не к жестко заданному коду, описанному в вопросе, а к его реальному использованию и развитию.
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines