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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
#1

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

10.10.2013, 13:13. Просмотров 505. Ответов 5

Ситуация:
Производный класс образован от двух базовых. Базовые классы не пустые, в одном хранится ссылка на картинку 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) не пользуется конструкторами копий базовых классов
Посмотрите здесь:

Шаблоны классов, list (STL) - C++
Здравствуйте, столкнулся с проблемой, что при повторном выполнении цикла генерируется исключение "access violation", в чем может быть...

Подскажите с конструкторами классов - C++
Напишите пожалуйста кратенькие примеры конструкторов класса. Примеры конструкторов к этому классу пожалуйста (конструктор: копирования,...

Ошибка в инициализации базовых классов - C++
Привет. Пишу код из книги Лафоре. #include <iostream> using namespace std; #include <windows.h> enum posneg {pos, meg}; class...

Использование базовых и производных классов - C++
Не могу решить задачу с классами помогите с решением. Создать класс String – строка. Определить функции присваивания одной строки...

Класс наследуемый от двух базовых классов - C++
Друзья Являеться ли класс (А)- Классом наследуемым от двух базовых классов? Если не правильно то как нужно написать ?.Помогите врозумить...

Нюансы использования абстрактных базовых классов (класс Shape) - C++
У меня класс Point наследуется с абстрактного базового класса Shape, и Point тоже абстрактный, поскольку не определил функцию get_area()....

Создать не менее 2-х базовых классов и класс, наследующий их поля - C++
Используя условия задач из лабораторной работы № 12-13, разработайте алгоритм и создайте программу с применением множественного...

Продолжение цепочки наследования без дублей базовых классов - C++
class A { public: A(); int x; }; class B : public A { public:

Структура наследования базовых/производных классов: error LNK 1104 - C++
Может быть проблема, если я неправильно что-то записал в структуре наследования базовых/производных классов?

STL list - C++
Доброго времени суток, пока имею поверхностное представление о алгоритмах STL и функциях для контейнеров, но есть задача: требуется...

STL list - C++
как вставить элемент в середину списка list STL? float list_insert_rand(int num) { srand (time(NULL)); int rand_num, rand_pos; ...

STL List - C++
Вот в чем проблема, была дана задача, решить которую надо было с помощью Deque и List, Deque надобыло оформить через STL, а List написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
10.10.2013, 13:22     List (STL) не пользуется конструкторами копий базовых классов #2
Deimon, Реализацию конструкторов копии покажите. Предполагаю что конструкторы копии базовых классов не вызываются явно из производных.
Deimon
35 / 35 / 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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
10.10.2013, 14:40  [ТС]     List (STL) не пользуется конструкторами копий базовых классов #5
Спасибо огромное! Все просто божественно заработало!)
Сам бы не допер, и узнал бы, прочитав не одну тонну страниц

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru