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

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

Восстановить пароль Регистрация
 
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 20:53     когда должен вызываться конструктор? #1
Возможно я делаю что-то не так, но конструктор родительского класса вызывается лишний раз.

код:
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. И что нужно сделать, чтобы избавиться от двойного вызова?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
17.10.2012, 21:02     когда должен вызываться конструктор? #2
Цитата Сообщение от OlVD Посмотреть сообщение
Circle constructor дважды вызывается Shape constructor.
один раз он вызывается для Circle это ребенок Shape
второй раз для CPoint тоже ребенок Shape
а в CPoint срабатывает конструктор копирования
Цитата Сообщение от OlVD Посмотреть сообщение
point copy constructor
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 21:06  [ТС]     когда должен вызываться конструктор? #3
а можно как-то организовать, чтобы Shape conctructor вызывался только один раз при вызове создании круга?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.10.2012, 21:07     когда должен вызываться конструктор? #4
Один раз для того CShape, от которого наследуется CCircle. Один раз для того CShape, который внутри поля CPoint itsCenter внутри CCircle. Затем конструктор копирования поля itsCenter и наконец после всех списков инициализации конструктор самого CCircle. Всё окей.

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

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

Добавлено через 5 минут
Цитата Сообщение от OlVD Посмотреть сообщение
Просто мне необходимо сделать подсчет созданных фигур в программе
а так ты их не подсчитаешь
для подсчета сделай в родителе статический член
и функцию которая увеличивает его на 1
и вызывай в каждом конструкторе ребенка
но все равно в CCircle две фигуры сам CCircle и CPoint
простейший выход не наследовать CPoint
все равно он свойствами фигуры не обладает
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 в других классах, получится нагромождение(
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
17.10.2012, 21:36     когда должен вызываться конструктор? #9
Цитата Сообщение от OlVD Посмотреть сообщение
если не использовать CPoint в других классах, получится нагромождение(
почему??? используй другой класс (или структуру)например МyPoint который будет содержать только координаты точки но при этом не будет наследником CShape
OlVD
0 / 0 / 0
Регистрация: 10.07.2012
Сообщений: 29
17.10.2012, 21:41  [ТС]     когда должен вызываться конструктор? #10
Хорошая идея! Просто создать отдельный класс, для координат точек...

Добавлено через 25 секунд
Всем большое спасибо)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2012, 21:47     когда должен вызываться конструктор?
Еще ссылки по теме:

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен C++
C++ Когда в классе нужен копирующий конструктор?
C++ Когда оператор должен быть обязательно членом класса, и когда он обязательно не принадлежит классу?

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
17.10.2012, 21:47     когда должен вызываться конструктор? #11
Цитата Сообщение от OlVD Посмотреть сообщение
Всем большое спасибо)))
Для спасибы кнопка есть

Добавлено через 2 минуты
кстати этот класс(который свой) может лежать членом и в родителе
для точки он будет показывать координаты, для окружности центр, для ломаной первую точку......
Yandex
Объявления
17.10.2012, 21:47     когда должен вызываться конструктор?
Ответ Создать тему
Опции темы

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