С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102

Конструктор копирования в наследуемом классе

10.05.2020, 20:22. Показов 3788. Ответов 15

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите правильно ли я вызываю конструктор копирования в наследуемом классе.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <vector>
 
class Particle {
protected:
    double x, y;
    double vx, vy;
    double radius;
public:
    Particle() { x = 0; y = 0; radius = 0;  }
    Particle(double ax, double ay, double aradius)
         : x(ax), y(ay), radius(aradius) {}
    Particle(const Particle& obj) {
        x = obj.x;
        y = obj.y;
        radius = obj.radius;
    }
    virtual ~Particle() {}
    
    //virtual void Collision() = 0;
 
    void Move(time) {
        x += vx * time;
        y += vy * time;
    };
 
};
 
class heavyParticle : public Particle {
private:
    double mass;
    colorArray color;
public:
    
    heavyParticle() : Particle(), colorArray() { mass = 0; }
    
    heavyParticle(double ax, double ay, double aradius, double amass) 
        : Particle(ax, ay, aradius), mass(amass) {}
    
    heavyParticle(const heavyParticle& obj) : Particle(obj), colorArray(???) {
         mass = obj.mass
    }
    virtual ~heavyParticle() {}
 
    //virtual Collision() {}
};
 
class colorArray {
private:
    unsigned* array;
    unsigned size;
    static const unsigned N;
public:
    colorArray() { 
        size = N;
        array = new unsigned[N];
    }
    colorArray(const colorArray& tmp) {
        size = N;
        array = new unsigned[N];
        for(unsigned i = 0; i < size; i++)
            array[i] = tmp.array[i];
    }
    ~colorArray() { delet[] array }
};
const unsigned сolorArray::N = 4; // размерность цветового массива тяжелой частицы
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2020, 20:22
Ответы с готовыми решениями:

Конструктор копирования в классе с вектором
есть класс..в нем поле с вектором..нужно 3 конструктора (по умолчанию..с параметрами и копирования)..2 сделал..а вот третий не получается ...

Конструктор копирования в шаблонном классе
//Header.h #include &lt;iostream&gt; #include &lt;conio.h&gt; #define NULL 0 template &lt;typename T&gt; class Laser { ...

Конструктор копирования в классе матрицы
Всем привет! Можете подсказать что не так с моим конструктором копирования? Отладчик на него жалуется, хотя на деле он работает. Matrix...

15
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.05.2020, 20:25
Цитата Сообщение от Glbvnts Посмотреть сообщение
Подскажите правильно ли я вызываю конструктор копирования в наследуемом классе.
C++
1
2
3
4
5
6
heavyParticle(const heavyParticle& obj) 
: Particle(obj)
, colorArray(obj.colorArray) 
, mass(obj.mass)
{
}
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
10.05.2020, 20:41
Цитата Сообщение от Glbvnts Посмотреть сообщение
Подскажите правильно ли я вызываю конструктор копирования в наследуемом классе.
В смысле? Вот это

C++
1
heavyParticle(const heavyParticle& obj) : Particle(obj), colorArray(???) {
?

Нет, не правильно. В С++ нет никакого ???.

В действительности вопрос состоит в том, зачем вы вообще явно писали конструкторы копирования для классов Particle и heavyParticle? Единственный класс в вашем коде, которому нужен явный конструктор копирования, это colorArray. Вся идея явного предоставления правильных конструкторов копирования (и пр. специальный методов) для низкоуровневых классов в С++ заключается в том, чтобы поскорее применить "Правило Нуля", то есть не писать эти методы вообще. Вы же зачем-то продолжаете вбивать в код эти ненужные определения. Зачем?

Цитата Сообщение от Glbvnts Посмотреть сообщение
C++
1
2
3
4
5
class colorArray {
private:
    unsigned* array;
    unsigned size;
    static const unsigned N;
Непонятно, какой смысл в поле size, если ваш класс сразу прошит на создание массивов жестко фиксированного размера N.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
10.05.2020, 21:03  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, не правильно. В С++ нет никакого ???.
Не из того файла скопировал кусок кода, у меня было почти также как в ответе oleg-m1973, хотел убедиться, что верно.

Согласен.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Непонятно, какой смысл в поле size, если ваш класс сразу прошит на создание массивов жестко фиксированного размера N.
Не подумал. Согласен.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы же зачем-то продолжаете вбивать в код эти ненужные определения.
спасибо!
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
10.05.2020, 21:08
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Непонятно, какой смысл в поле size, если ваш класс сразу прошит на создание массивов жестко фиксированного размера N.
... более того, в такой ситуации нет необходимости и в динамическом распределении памяти в классе colorArray. А если избавиться от динамического распределения памяти, то отпадет необходимость явно писать конструктор копирования и в этом классе тоже.
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
10.05.2020, 21:09  [ТС]
Цитата Сообщение от Glbvnts Посмотреть сообщение
Particle() { x = 0; y = 0; radius = 0;  }
    Particle(double ax, double ay, double aradius)
         : x(ax), y(ay), radius(aradius) {}
TheCalligrapher, объясните пожалуйста, технически в чем разница между

C++
1
Particle() { x = 0; y = 0; radius = 0;  }
и
C++
1
Particle() : Particle(0, 0, 0) {}
?

Я понимаю, что первое это присваивание, а второе инициализация. Вопрос в том, что и когда использовать и почему?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.05.2020, 21:23
Цитата Сообщение от Glbvnts Посмотреть сообщение
Я понимаю, что первое это присваивание, а второе инициализация. Вопрос в том, что и когда использовать и почему?
Первое - присваивание, второе - вызов другого конструктора
Инициализация:
C++
1
2
3
4
5
6
Particle()
: x(0)
, y(0)
, radius(0) 
{
}
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
10.05.2020, 21:34  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Первое - присваивание, второе - вызов другого конструктора
Понял.

Вообще говоря инициализация и присваивание это не одно и тоже? Почему?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.05.2020, 21:46
Цитата Сообщение от Glbvnts Посмотреть сообщение
Вообще говоря инициализация и присваивание это не одно и тоже? Почему?
При присваивании переменная уже проинициализирована (в общем случае), т.е. ты изменяешь значение - в случае конструктора лишняя операция (иногда довольно тяжёлая)
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
10.05.2020, 21:54
Цитата Сообщение от Glbvnts Посмотреть сообщение
Вообще говоря инициализация и присваивание это не одно и тоже? Почему?
В смысле "почему"? По определению.

Инициализация - это назначение значения объекту, который до этого никакого значения не имел вообще.

Присваивание - это назначение нового значения объекту, который этого уже имел старое значение.
1
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
10.05.2020, 21:57  [ТС]
oleg-m1973, значит в случае конструктора, лучше использовать инициализацию или вызов конструктора?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.05.2020, 21:59
Цитата Сообщение от Glbvnts Посмотреть сообщение
oleg-m1973, значит в случае конструктора, лучше использовать инициализацию или вызов конструктора?
В другом конструкторе может выполняться какой-то код, поэтому лучше без необходимости его не вызывать. А так - без разницы (ну, почти)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
10.05.2020, 22:40
Цитата Сообщение от Glbvnts Посмотреть сообщение
в случае конструктора, лучше использовать инициализацию или вызов конструктора?
Тут нет никакого "лучше" иди "хуже". Вопрос в том, что именно вам нужно. Если другой конструктор делает именно то, что вам нужно, то лучше вызвать другой конструктор. Для того в язык С++ такая возможность и была введена.
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
11.05.2020, 00:06  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
более того, в такой ситуации нет необходимости и в динамическом распределении памяти в классе colorArray
A что тогда будет делать конструктор по умолчанию?
C++
1
for(unsigned i = 0; i < N; i++) array[i] = 0;
и параметрический конструктор?

C++
1
2
3
4
5
6
7
8
9
class colorArray {
private:
   static const unsigned N;
   unsigned array[N] {};
public:
    colorArray() {}
    ~colorArray() {}
};
const unsigned сolorArray::N = 4; // размерность цветового массива тяжелой частицы
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1819
Регистрация: 18.10.2014
Сообщений: 17,200
11.05.2020, 00:53
Цитата Сообщение от Glbvnts Посмотреть сообщение
A что тогда будет делать конструктор по умолчанию?
Конструктор по умолчанию - это совершенно отдельная тема. Это ваша обязанность - добиться того, чтобы он делал то, что вам нужно.

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

C++
1
2
3
4
5
class colorArray {
private:
   static const unsigned N = 4;
   unsigned array[N]{};
};
В таком варианте вам вообще не нужно писать конструктор по умолчанию самостоятельно - компилятор напишет его за вас и в нем от будет обнулять этот массив.

Цитата Сообщение от Glbvnts Посмотреть сообщение
и параметрический конструктор?
Не понимаю, о чем идет речь.
0
Я не улыбаюсь.
-8 / 1 / 0
Регистрация: 10.03.2020
Сообщений: 102
11.05.2020, 14:26  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В таком варианте вам вообще не нужно писать конструктор по умолчанию самостоятельно - компилятор напишет его за вас и в нем от будет обнулять этот массив.
то есть если я напишу так
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
unsigned array[N]{};
это гарантия того, что будет вызван конструктор по умолчанию, а он сделает то что мне нужно?

Добавлено через 40 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Инициализация - это назначение значения объекту, который до этого никакого значения не имел вообще.
А где гарантия, что скажем при объявлении переменной int a; там нет "муссора"?

Может быть вы имели ввиду, что у объекта не было назначенного нами значения ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.05.2020, 14:26
Помогаю со студенческими работами здесь

Конструктор копирования и операция присваивания в классе
Народ, вот есть такие объявления(motto - объект класса StringBad): StringBad ditto(motto); StringBad metoo = motto; StringBad...

Почему не срабатывает конструктор копирования в пользовательском классе
вроде со всем разобралась, но не заходит в конструктор копирования. В чём ошибка? #include &lt;iostream&gt; #include...

Уничтожается структура данных в наследуемом классе
Здравствуйте. У меня в ходе написании программы появилась проблема. У меня почему то не сохраняется структура. Здесь я привел текс...

Полиморфизм. Для чего нужны аргументы базового класса в наследуемом классе?
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Goods { protected: int width; int height; double...

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru