Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
kylroma
Одессит
204 / 75 / 23
Регистрация: 30.12.2013
Сообщений: 276
Записей в блоге: 1
Завершенные тесты: 2
#1

Лишнее удаление родителя при создании класса наследника - C++

18.06.2014, 09:50. Просмотров 278. Ответов 4
Метки нет (Все метки)

Не могу понять откуда в выводе программы появляется первая надпись "delete A". По идее надписей "delete" должно быть столько же, сколько и "create". Или я не прав?

Лишнее удаление родителя при создании класса наследника

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
#include <iostream>
 
 
class A{
private:
    int a;
public:
    A(){std::cout << "create A()\n";};
    A(int aa): a(aa){std::cout << "create A = " << a << std::endl;};
    ~A(){std::cout << "delete A\n";}
    void Show(){std::cout << "A = " << a << std::endl;}
 
};
 
class B{
private:
    A b;
public:
    B(){std::cout << "create B()\n";};
    B(A bb): b(bb) {std::cout << "create B\n";};
    ~B(){std::cout << "delete B\n";};
    void ShowB(){b.Show();}
};
 
int main()
{
    B d(5);
   // A c(7);
    //c.Show();
    //d.ShowB();
    std::cout << "***********" << std::endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2014, 09:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Лишнее удаление родителя при создании класса наследника (C++):

Правда, что указатель класса-наследника не может указывать на объект класса-родителя? - C++
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...

Нужно из класса наследника передать параметры в класс родителя - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; class ploskost{ protected: float d; int x1,y1,x2,y2; public: ...

Как избежать повтора параметров конструктора класса-родителя в конструкторе наследника? - C++
С каждым новым наследуемом классом, число параметров конструктора увеличивается. class A { public: A(int a, float b, double c) ...

Доступ к приватному методу наследника через родителя - C++
Тут натолкнулся на интересную штуку. #include &lt;iostream&gt; using namespace std; class A { public: virtual void f() { ...

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

Вызов конструктора базового класса из класса-наследника - C++
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a; public: A(int c):a(c){} ...

4
SatanaXIII
Супер-модератор
Эксперт С++
5666 / 2711 / 255
Регистрация: 01.11.2011
Сообщений: 6,635
Завершенные тесты: 1
18.06.2014, 10:46 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
А вот откуда:
C++
1
2
3
4
5
6
7
8
9
10
11
class A{
private:
    int a;
public:
    A(){std::cout << "create A()\n";};
    A(int aa): a(aa){std::cout << "create A = " << a << std::endl;};
    A( A& ){std::cout << "copy A" << std::endl;}
    ~A(){std::cout << "delete A\n";}
    void Show(){std::cout << "A = " << a << std::endl;}
 
};
Конструктор копирования
1
Jewbacabra
Эксперт PHP
2817 / 2404 / 904
Регистрация: 24.04.2014
Сообщений: 7,257
18.06.2014, 10:50 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
kylroma,
Цитата Сообщение от kylroma Посмотреть сообщение
B d(5);
тут сначала 5 приводится к A и создается временный объект типа A (выводит create A = 5)
потом полученный объект передается в качестве аргумента в конструктор B(A) по значению, т.е создается копия A (конструктора копий в классе A нету, будет создан по умолчанию и по этому ничего не выводит) и создается объект B (create B)
Потом временный объект удаляется (выводит delete A)
К завершению работы удаляется объект B (выводит delete B) и A (delete A)

Если хочешь чтобы по 3 раза вывел create и delete добавь в класс A конструктор копий:
C++
1
2
3
4
A(const A& aa){
        std::cout << "create A(A)" << std::endl; 
        if (this != &aa) a = aa.a;
    }
1
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
18.06.2014, 10:57 #4
Цитата Сообщение от Jewbacabra Посмотреть сообщение
if (this != &aa) a = aa.a;
wtf?
0
Jewbacabra
Эксперт PHP
2817 / 2404 / 904
Регистрация: 24.04.2014
Сообщений: 7,257
18.06.2014, 11:00 #5
aLarman, не выспался из-за нашей замечательной сборной , с оператором присваивания перепутал
0
18.06.2014, 11:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2014, 11:00
Привет! Вот еще темы с ответами:

Удаление экземпляра класса в функции самого класса (Ошибка при отладке) - C++
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

Ошибка при создании класса - C++
написал класс:#include&lt;windows.h&gt; class Hook{ public: void SetHook(){ HINSTANCE hinstDLL = GetModuleHandle(NULL); if...

Трудности при создании класса - C++
Делаю приложения на Windows Forms. Надо сделать иерархию классов. В абстрактом классе описал нужные поля, но при попыте скомпилировать...

Инициализация членов дочернего класса членами класса родителя - C++
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами класса A?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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