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

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

Войти
Регистрация
Восстановить пароль
 
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
#1

Когда должен вызываться конструктор? - C++

17.10.2012, 20:53. Просмотров 471. Ответов 10
Метки нет (Все метки)

Возможно я делаю что-то не так, но конструктор родительского класса вызывается лишний раз.

код:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <sstream>
 
using namespace std;
 
class MyException
{
public:
    MyException(const string & msg):
        mymsg(msg)
    {
    }
 
    const char* what() const { return mymsg.c_str(); }
 
private:
    string mymsg;
};
 
string ConvertToString(double x)
{   
    ostringstream os;
   os << x;
   return os.str();
}
 
 
class CShape
{
public:
    CShape(){ HowManyShapes++; cout << "Shape constructor" << endl; }
    virtual ~CShape(){ HowManyShapes--; }
 
    static int GetCount() { return HowManyShapes; }
private:
    static  int HowManyShapes;
};
 
int CShape :: HowManyShapes = 0;
 
 
 
 
class CPoint : public CShape
{
public:
    CPoint(string s, double x, double y);
    CPoint(const CPoint& _point);
    virtual ~CPoint() { } //may be virtual? and may be {}
 
    string GetPointName() { return name; }
    double GetCoordX() const { return coordX; }
    double GetCoordY() const { return coordY; }
 
 
protected:
    string name;
    double coordX;
    double coordY;
};
 
CPoint::CPoint(string s, double x, double y)
{
    cout << "point constructor" << endl;
    coordX = x;
    coordY = y;
    name = s;
}
 
CPoint::CPoint(const CPoint& _point):
coordX(_point.coordX), coordY(_point.coordY), name(_point.name)
{
    cout << "point copy constructor" << endl;
}
 
 
 
class CCircle : public CShape
{
public:
    CCircle(string s, const CPoint & _center, double radius);
    CCircle(const CCircle& _circle);
    virtual ~CCircle(){ }
 
    double GetArea() const { return 3 * itsRadius * itsRadius; }
private:
    string name;
    double itsRadius;
    CPoint itsCenter;
};
 
CCircle::CCircle(string s, const CPoint & _center, double radius):
itsCenter(_center)
{
    cout << "Circle constructor" << endl;
    name = s;
    itsRadius = radius;
    if (itsRadius < 0) throw MyException("Radius can't be < 0");
}
 
CCircle::CCircle(const CCircle& _circle):
itsCenter(_circle.itsCenter), itsRadius (_circle.itsRadius), name(_circle.name)
{
}
 
 
int main()
{
    try
    {
        CPoint A("A", 30, 28);
        cout << endl;
    
        CCircle circle ("Ou", A, 2);
 
        cout << endl;
 
 
        cout <<"NUM FIGURES: " <<CShape::GetCount() <<endl;
        
    }
    catch (MyException &e)
    {
        cout << e.what() << endl;
        return -1;
    }
 
    return 0;
}
результат:
C++
1
2
3
4
5
6
7
8
9
Shape constructor
point constructor
 
Shape constructor
Shape constructor
point copy constructor
Circle constructor
 
NUM FIGURES: 3
почему перед Circle constructor дважды вызывается Shape constructor. И что нужно сделать, чтобы избавиться от двойного вызова?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2012, 20:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Когда должен вызываться конструктор? (C++):

Должен ли вызываться деструктор при создании? - C++
есть класс с конструктором и деструктором #ifndef PROCESSOR_H #define PROCESSOR_H #include &quot;Problem.h&quot; #include &lt;list&gt; ...

Когда оператор должен быть обязательно членом класса, и когда он обязательно не принадлежит классу? - C++
Нужно узнать случаи, когда оператор функция должна быть обязательно членом класса и случаи, когда оператор- функция обязательно не...

Почему конструктор не должен иметь возвращаемое значение? - C++
Почему конструктор не должен иметь возвращаемое значение? Мне кажется это было бы полезным.

Объект умирает когда не должен - C++
Пытаюсь сделать функцию, которая бы возвращала созданый ею объект (src), но он почему - то помирает: bool G::addCom(){ cv::Mat* src; ...

Определить, когда должен быть звонок - C++
Здравствуйте. На днях решал задачу под названием &quot;Звонок&quot;. Собственно, вот условие задачи: Входные данные:* В первой строке записано...

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен - C++
#include &lt;iostream&gt; class A {}; int main() { A i; A j(i); return 0;

10
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
17.10.2012, 21:02 #2
Цитата Сообщение от OlVD Посмотреть сообщение
Circle constructor дважды вызывается Shape constructor.
один раз он вызывается для Circle это ребенок Shape
второй раз для CPoint тоже ребенок Shape
а в CPoint срабатывает конструктор копирования
Цитата Сообщение от OlVD Посмотреть сообщение
point copy constructor
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 21:06  [ТС] #3
а можно как-то организовать, чтобы Shape conctructor вызывался только один раз при вызове создании круга?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.10.2012, 21:07 #4
Один раз для того CShape, от которого наследуется CCircle. Один раз для того CShape, который внутри поля CPoint itsCenter внутри CCircle. Затем конструктор копирования поля itsCenter и наконец после всех списков инициализации конструктор самого CCircle. Всё окей.

Чтоб один раз — очевидно же: не наследовать CCircle от CShape. Это единственный способ, если itsCenter будет полем и при этом считаться фигурой.
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
17.10.2012, 21:09 #5
Цитата Сообщение от OlVD Посмотреть сообщение
а можно как-то организовать, чтобы Shape conctructor вызывался только один раз при вызове создании круга?
А зачем ???
передавай параметр CPoint в конструктор Circle вот так
C++
1
CCircle::CCircle(string s,  CPoint * _center, double radius):
и копируй поля вручную
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 21:09  [ТС] #6
Просто мне необходимо сделать подсчет созданных фигур в программе
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
17.10.2012, 21:18 #7
пардон не получится у тебя
Цитата Сообщение от OlVD Посмотреть сообщение
CPoint itsCenter;
это тоже наследник CShape

Добавлено через 1 минуту
впрочем ~OhMyGodSoLong~, это уже объяснил

Добавлено через 5 минут
Цитата Сообщение от OlVD Посмотреть сообщение
Просто мне необходимо сделать подсчет созданных фигур в программе
а так ты их не подсчитаешь
для подсчета сделай в родителе статический член
и функцию которая увеличивает его на 1
и вызывай в каждом конструкторе ребенка
но все равно в CCircle две фигуры сам CCircle и CPoint
простейший выход не наследовать CPoint
все равно он свойствами фигуры не обладает
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 21:23  [ТС] #8
это только один вариант с кругом, там много других. Вот задание:

Создать абстрактный базовый класс объектов на декартовой плоскости CShape (фигура).
Спроектировать и реализовать иерархию классов конкретных фигур: CPoint (точка), CCircle (окружность),
CRect (прямоугольник), CSquare (квадрат), CPolyline (ломаная), CColorPoint (точка, у которой есть цвет).

При этом:
...
- реализовать возможность узнать, сколько существует вообще фигур, с помощью статического метода CShape::GetCount().
- у всех объектов должен быть реализован метод с именем "ToString" который возвращает
информацию в текстовом виде о данном экземпляре (не менее трех характеристик; у точки есть имя и координаты,
у окружности ещё есть радиус и площадь, у ломаной - длина и т.п.).

если не использовать CPoint в других классах, получится нагромождение(
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
17.10.2012, 21:36 #9
Цитата Сообщение от OlVD Посмотреть сообщение
если не использовать CPoint в других классах, получится нагромождение(
почему??? используй другой класс (или структуру)например МyPoint который будет содержать только координаты точки но при этом не будет наследником CShape
0
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 21:41  [ТС] #10
Хорошая идея! Просто создать отдельный класс, для координат точек...

Добавлено через 25 секунд
Всем большое спасибо)))
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
17.10.2012, 21:47 #11
Цитата Сообщение от OlVD Посмотреть сообщение
Всем большое спасибо)))
Для спасибы кнопка есть

Добавлено через 2 минуты
кстати этот класс(который свой) может лежать членом и в родителе
для точки он будет показывать координаты, для окружности центр, для ломаной первую точку......
1
17.10.2012, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2012, 21:47
Привет! Вот еще темы с ответами:

Когда создается конструктор по умолчанию? - C++
Здравствуйте, товарищи! Прочитал тут книгу &quot;Ассемблер и дизасеммблирование&quot; Пирогова и открыл для себя такую вещь, что конструктор...

Когда вызывается конструктор копирования? - C++
Пожалуйста помогите ответить на вопрос &quot;Когда вызывается конструктор копирования?&quot;

Когда в классе нужен копирующий конструктор? - C++
Меня интересует вопрос когда в классе нужен копирующий конструктор.

Как должен отработать конструктор ofstream (char* file) при отсутствии файла? - C++
Методом научного тыка я выяснил, что если такого файла нет, он его создаёт; но где оговорено такое поведение конструктора? Я так понимаю,...


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

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

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