Форум программистов, компьютерный форум CyberForum.ru

List (STL) не пользуется конструкторами копий базовых классов - C++

Восстановить пароль Регистрация
 
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
10.10.2013, 13:13     List (STL) не пользуется конструкторами копий базовых классов #1
Ситуация:
Производный класс образован от двух базовых. Базовые классы не пустые, в одном хранится ссылка на картинку Grphics::TBitmap, а в другом числовые значения:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Image {
  private:
    GTB * mImage;
  protected:
    ~Image( void);
    Image( void);
    Image( const Image&);
        //остальные методы
};
 
class Object {
  private:
    TPoint mPos;
  protected:
    ~Object( void); 
    Object( void);
    Object( const Object&); 
        //остальные методы
};
 
class GraphicObject : public Image, public Object {
  private:
    //параметры
  protected:
    //параметры
  public:
    GraphicObject( void);
    ~GraphicObject( void);
    GraphicObject( const GraphicObject&);
    //остальные методы
};
Я добавляю объекты производного класса (GraphicObject) в список (list), который сам увеличивает свою емкость, применяя конструктор копий. И вот когда он запускает конструктор копий производного класса, почему-то он запускает обычные конструкторы базовых классов, и они оказываются пустыми. Что нужно сделать, чтобы STL библиотеки везде применяли конструкторы копий?!

И второй вопрос, который вызывает тот же самый эффект отсутствия данных в скопированном объекте.
В список новый элемент я добавляю так: создаю временный новый, заношу параметры и копирую его в список.
C++
1
2
3
4
  GraphicObject temp;
  temp.LoadAnimation( 8, 100, false, "./simple.BMP");
  temp.SetPosition(x,y);
  Box.push_back(GraphicObject(temp));
При копировании точно так же себя ведет - запускает конструктор копий производного класса и обычные конструкторы базовых. Как сделать копирование полноценным?

Спасибо за внимание
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2013, 13:13     List (STL) не пользуется конструкторами копий базовых классов
Посмотрите здесь:

Класс наследуемый от двух базовых классов C++
C++ STL list
C++ Подскажите с конструкторами классов
Ошибка в инициализации базовых классов C++
C++ Использование базовых и производных классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.10.2013, 13:22     List (STL) не пользуется конструкторами копий базовых классов #2
Deimon, Реализацию конструкторов копии покажите. Предполагаю что конструкторы копии базовых классов не вызываются явно из производных.
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
10.10.2013, 14:00  [ТС]     List (STL) не пользуется конструкторами копий базовых классов #3
ForEveR, Да, явно я их не вызываю. Честно говоря, у меня были попытки сделать все, как говорится, в лоб - вызвать явно, и не искать красивого решения проблемы так, как это могло бы предполагаться в STL массивах. Но я так и не смог вызвать скрытый от производного метод, да еще и отправить туда приватную часть копируемого объекта. Подскажите пожалуйста, как это правильно сделать, а то я с таким не сталкивался пока что.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
GraphicObject::GraphicObject( const GraphicObject & original) {
  mFrame = new GTB();
  mCurrentFrame = original.mCurrentFrame;
  mTotalFrames = original.mTotalFrames;
  mWidth = original.mWidth;
  mHeight = original.mHeight;
  mFps = original.mFps;
  mWait = original.mWait;
  mReverse = original.mReverse;
  mAutoReverse = original.mAutoReverse;
  mLastAnimate = original.mLastAnimate;
  mFrame->Assign(original.mFrame);
  mRedraw = original.mRedraw;
}
 
Image::Image( const Image & original) {
  mImage = new GTB();
  mImage->Assign(original.mImage);
}
 
Object::Object( const Object & original) {
  mPos.x = original.mPos.x;
  mPos.y = original.mPos.y;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.10.2013, 14:28     List (STL) не пользуется конструкторами копий базовых классов #4
Deimon, Просто вызываем конструктор копии базового класса.
C++
1
2
3
4
5
GraphicObject::GraphicObject( const GraphicObject & original) : 
Image(original), Object(original)
{
   // code
}
Хотя вот сильно подозреваю, что куда логичнее сделать mImage smart-pointer-ом и конструктор копии станет не нужен.
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
10.10.2013, 14:40  [ТС]     List (STL) не пользуется конструкторами копий базовых классов #5
Спасибо огромное! Все просто божественно заработало!)
Сам бы не допер, и узнал бы, прочитав не одну тонну страниц

Цитата Сообщение от ForEveR Посмотреть сообщение
Deimon, Просто вызываем конструктор копии базового класса.
я так понимаю, сделать это можно только после ":" ? в теле функции у меня ругается, и на отсутствие в GraphicObject такого метода, и на двойное объявление original, хотя наверно вторая ошибка из-за первой.

Цитата Сообщение от ForEveR Посмотреть сообщение
куда логичнее сделать mImage smart-pointer-ом
Вот бы узнать, что это такое и из чего состоит =)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.10.2013, 14:46     List (STL) не пользуется конструкторами копий базовых классов #6
Deimon, Да, исключительно в списке инициализации, иначе это бессмысленно. Лучше как можно больше объектов инициализировать в списке инициализации (если точнее ВСЕ, что только возможно). По смарт пойнтерам можно погуглить например.
Yandex
Объявления
10.10.2013, 14:46     List (STL) не пользуется конструкторами копий базовых классов
Ответ Создать тему

Метки
list, базовый, класс, конструктор, копий
Опции темы

Текущее время: 20:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru