как правильно написать конструктор инициализации?
От: seego  
Дата: 17.10.05 18:16
Оценка:
Мой файл picture.h
class Picture: public Figure {
public:

....
  Picture (const Picture& p);
.....

private:

std::vector<const Shape*> sContainer;
Graphics *grDevice;
  
};

как правильно написать конструктор инициализации
picture.cpp
Picture::Picture(const Picture& p)
{
?????????????????
}


Спасибо.
Re: как правильно написать конструктор инициализации?
От: StatujaLeha на правах ИМХО
Дата: 17.10.05 18:30
Оценка:
Здравствуйте, seego, Вы писали:

S>Мой файл picture.h

S>
S>class Picture: public Figure {
S>public:

S>....
S>  Picture (const Picture& p);
S>.....

S>private:

S>std::vector<const Shape*> sContainer;
S>Graphics *grDevice;
  
S>};
S>

S>как правильно написать конструктор инициализации
S>picture.cpp
S>
S>Picture::Picture(const Picture& p)
S>{
S>?????????????????
S>}
S>


S>Спасибо.


Видимо ты хотел сказать конструктор копирования. Кода, который ты привел, недостаточно, чтобы дать конкретный совет. Пиши объявление класса полностью. Например, неясно, есть ли у тебя указатели в классе и если есть, то как они используются.
Re[2]: как правильно написать конструктор инициализации?
От: seego  
Дата: 17.10.05 18:52
Оценка:
>Видимо ты хотел сказать конструктор копирования. Кода, который ты привел, недостаточно, чтобы дать конкретный >совет. Пиши объявление класса полностью. Например, неясно, есть ли у тебя указатели в классе и если есть, то как >они используются.

Я имел ввиду конструктор копирования. Мой класс picture имеет два private members
...
std::vector<const Shape*> sContainer;
Graphics *grDevice;
....


Вектор содежит указатели на виртуальный Shape, от которого происходит наследование. Эти указатели будут использоваться для вызова виртуальных методов наследников Shape.

Copy constructor должен скопировать все поля из объекта переданного в качестве параметра в конструктор копирования. Я могу добавлять любые методы, но не думаю что корректно делат что-то вроде
....
std::vector<const Shape*> Picture::getContainer() return sContainer;
...
Graphics Picture::getGR() return grDevice;
......
.....
}
Re[3]: как правильно написать конструктор инициализации?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 17.10.05 19:18
Оценка:
Здравствуйте, seego, Вы писали:

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


S>Я имел ввиду конструктор копирования. Мой класс picture имеет два private members

S>
S>...
S>std::vector<const Shape*> sContainer;
S>Graphics *grDevice;
S>....
S>


S>Вектор содежит указатели на виртуальный Shape, от которого происходит наследование. Эти указатели будут использоваться для вызова виртуальных методов наследников Shape.


может ты хотел сказать абстрактный?

Все еще непонятно как ты работаешь с указателями
Судя по вопросу, тебе недостаточно просто shallow-копирования

Picture::Picture(const Picture& p)
: sContainer(p.sContainer),
grDevice(p.grDevice)
{
}


Кроме того, раз уж у тебя появится недефолтный конструктор копии, следует написать и оператор присваивания
и деструктор
-- Андрей
Re[4]: как правильно написать конструктор инициализации?
От: seego  
Дата: 17.10.05 20:05
Оценка:
Здравствуйте, Андрей Коростелев, Вы писали:

АК>может ты хотел сказать абстрактный?

Да, извините Shape деиствительно абстрактный

АК>Все еще непонятно как ты работаешь с указателями

может это прояснит дело
//picture.cpp
......
void Picture::draw() const
{
     for(int i=0; i<sContainer.size(); ++i)
          sContainer[i]->draw(*grDevice);
     
}
......


АК>Судя по вопросу, тебе недостаточно просто shallow-копирования

Я не думаю, что shallow-copy будет уместно, т.к. мой вектор содержит указатели

АК>Picture::Picture(const Picture& p)

АК>: sContainer(p.sContainer),
АК> grDevice(p.grDevice)
АК>{
АК>}


АК>Кроме того, раз уж у тебя появится недефолтный конструктор копии, следует написать и оператор присваивания

АК>и деструктор
Проверьте пожалуйста destructor
...
Picture::~Picture()
{
 for(int i=0; i<sContainer.size(); ++i)
         delete sContainer[i];
 
 sContainer.clear();
}
...

С оператором присваивания определюсь как только напишу конструктор копирования
Re[5]: как правильно написать конструктор инициализации?
От: seego  
Дата: 17.10.05 20:14
Оценка:
private:
/** Moi  */
std::vector<Shape*> sContainer; //eto pravilno
Graphics *grDevice;
Re[6]: как правильно написать конструктор инициализации?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 17.10.05 20:48
Оценка:
Здравствуйте, seego, Вы писали:


S>
S>private:
S>/** Moi  */
S>std::vector<Shape*> sContainer; //eto pravilno
S>Graphics *grDevice;
S>


Судя по тому, что удалаешь через delete, стало быть создаешь через new

Например, так
Picture::Picture (const Picture& p)
{
  for (std::vector<const Shape*>::const_iterator myIt = p.sContainer.begin(), myEnd(p.sContainer.end());
       myIt!=myEnd; ++myIt)
  {
      sContainer.push_back(new Shape(*(*myIt)));//как видишь также нужен конструктор копии для Shape
  }
  grDevice = new Graphics(*p.grDevice);// ... и для Graphics
}


sContainer.clear() в деструкторе вообще-то необязательно
-- Андрей
Re[7]: как правильно написать конструктор инициализации?
От: VoidEx  
Дата: 17.10.05 20:54
Оценка:
Раз у него Shape* абстрактный, то, я думаю, ему необходимо иметь метод Clone().
Re[8]: как правильно написать конструктор инициализации?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 17.10.05 21:14
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Раз у него Shape* абстрактный, то, я думаю, ему необходимо иметь метод Clone().

Ну да, абстрактность я упустил
-- Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.