9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
1

Базовый класс в иерархии наследования. Вывод свойств объектов

24.10.2014, 18:45. Показов 1959. Ответов 13
Метки нет (Все метки)

Здрасти. Помогите исправить функцию print_out именно таким образом:

C++
1
2
3
4
void print_out() {
                   void print_out_prop1(); // вывод какого-либо свойства объекта
                   void print_out_prop2();
}
Листинг моей программы:

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <iomanip> 
#include <conio.h>
#include <string.h>
 
#define M_PI 3.14159265358979323846
 
using namespace std;
 
/*================================================
Создать иерархию классов Точка-Круг-Конус. Конус должен
содержать метод определения объема. Последние два класса
должны иметь конструкторы.
===================================================*/
 
//Класс Point (Точка)
class Point { 
    public:
        int x;
        int y;
 
};
 
//Класс Cirlce (Круг)
class Circle : public Point {
    public:
        double r1; //радиус круга
 
        Circle(double r1) {
            r1 = r1;
        }
};
 
//Класс Cone (Конус)
class Cone : public Circle {
    public:
        double H; //высота конуса
        double volume; //объем конуса,,
        
        Cone(double r1, double h1):Circle(r1) {
            H = h1;
        }
 
        void calculate_volume() {
            volume = (1.0 / 3.0) * H * M_PI; //Формула для нахождения объема конуса
        }
 
 
        void print_out() {
            
            cout << "--------------------------------------------" << endl;
            cout << "Выводим все характеристики созданных объектов на экран: " << endl;
 
            cout << setw(25) << "Высота конуса: " << H << " единиц" << endl;
            cout << setw(25) << "Объем конуса: " << volume << endl;
                        cout << setw(25) << "Радиус конуса: " << r1 << " единиц" << endl;
            cout << "Выводим данные о сравнении двух конусов: " << endl;
        
        }
 
        void isLittle(Cone *obj) {
            cout << "1: Объем первого конуса: " << volume << " кубических единиц" << endl;
            cout << "2: Объем второго конуса: " << obj->volume << " кубических единиц" << endl;
 
            if (volume < obj->volume) {
                cout << "Объем первого конуса меньше, чем объем второго" << endl;
                print_out();
            }
            else
                obj->print_out();
            cout << "Объем первого конуса больше, чем объем первого" << endl;
        }
            
 
};
 
/*================================================
Создать метод MAIN, в котором создается два конуса,
определяется какой из конусов меньше, а также входит 
ли меньший конус в больший. Также показать все 
характеристики создаваемых объектов.
===================================================*/
 
void main() {
 
    setlocale(LC_ALL, "rus"); //настраиваем локаль
    setlocale(LC_NUMERIC, "C");
    
    /*================================================
    Такие параметры, чтобы меньший конус полностью
    входил в больший
    ===================================================*/
    Cone m(10, 10); 
    Cone n(6, 4); 
 
 
    m.calculate_volume(); //считаем объем первого конуса
    n.calculate_volume(); //считаем объем второго конуса
 
    m.isLittle(&n); //функция сравнения объемов двух конусов
    
    cout << "-------------------------------------------" << endl;
 
    system("pause");
}



Я не могу понять как вывести на экран данные радиуса и высоты второго конуса?
C++
1
 void print_out(Cone *obj)
не работает

Добавлено через 7 минут
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
void print_out_prop1() {
             
            cout << setw(25) << "Высота конуса: " << H << " единиц" << endl;
            cout << setw(25) << "Радиус конуса: " << r1 << " единиц" << endl;
            cout << setw(25) << "Объем конуса: " << volume << endl;
 
        }
 
        void print_out_prop2(Cone *obj) {
            cout << setw(25) << "Высота второго конуса: " << obj->H << " единиц" << endl;
            cout << setw(25) << "Радиус второго конуса: " << obj->r1 << " единиц" << endl;
            cout << setw(25) << "Объем второго конуса: " << obj->volume << endl;
        }
 
        void print_out() {
            
            cout << "--------------------------------------------" << endl;
            cout << "Выводим все характеристики созданных объектов на экран: " << endl;
 
            void print_out_prop1(); 
            void print_out_prop2();
            cout << "Выводим данные о сравнении двух конусов: " << endl;
        
        }

Вот еще такой вариант был, но блин, не работает что-то..
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2014, 18:45
Ответы с готовыми решениями:

Ошибка наследования error C2504: exception: не определен базовый класс
в .h файле пытаюсь унаследоваться class MyException : public exception { public: private:...

Добавление свойств в базовый класс
Товарищи, подскажите, как в приличном обществе принято решать такую задачу: Имеем, например,...

Базовый класс – СМИ. Производные – телеканал и газета. Создать класс Холдинг, который может содержать оба вида объектов
Базовый класс – СМИ. Производные – телеканал и газета. Создать класс Холдинг, который может...

Абстрактный базовый класс, коллекция объектов, прогрессия
Описать абстрактный базовый класс и производные от него и создать параметризованную коллекцию...

13
3658 / 2995 / 828
Регистрация: 25.03.2012
Сообщений: 11,036
Записей в блоге: 1
24.10.2014, 18:52 2
Цитата Сообщение от MessageToBears Посмотреть сообщение
Circle : public Point
круг это точка?
Цитата Сообщение от MessageToBears Посмотреть сообщение
Cone : public Circle
конус это круг?
Ты бредишь, а не учишься наследованию! Твои представления о наследовании в корне неверные!

впрочем, если хочешь закрыть на этот бред глаза, то просто добавь виртуальную функцию в каждый класс
Цитата Сообщение от MessageToBears Посмотреть сообщение
C++
1
2
3
4
5
6
//Класс Point (Точка)
 class Point { 
public: 
int x; 
int y; 
};
C++
1
2
3
4
5
6
7
//Класс Point (Точка)
 class Point { 
public: 
int x; 
int y; 
virtual void print();
};
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,246
24.10.2014, 18:58 3
Цитата Сообщение от MessageToBears Посмотреть сообщение
Circle(double r1)
{ r1 = r1; }
C++
1
2
Circle(double r1)
 { this->r1 = r1; }
Остальное вроде выводится правильно.
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2014, 19:05 4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Твои представления о наследовании в корне неверные!
Kuzia domovenok, почитай тему: Перегруженный оператор вывода
Там есть ссылка на литературу, где приведён пример такого наследования.
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:09  [ТС] 5
На сколько я понимаю то при наследовании производный класс получает атрибуты других классов, в моем случае, класс конус получает атрибут радиуса класса Круг.

Иными словами, чтобы посчитать объем Конуса нужно знать радиус круга (основания конуса).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Класс Cirlce (Круг)
class Circle : public Point {
    public:
        double r1; //радиус круга
 
        Circle(double r1) {
            r1 = r1;
        }
};
 
//Класс Cone (Конус)
class Cone : public Circle {
    public:
        double H; //высота конуса
        double volume; //объем конуса,,
        
        Cone(double r1, double h1):Circle(r1) {
            H = h1;
        }
Если я в чем-то не прав, поправьте.

Добавлено через 3 минуты
Цитата Сообщение от zss Посмотреть сообщение
Код C++
1
2
Circle(double r1)
{ this->r1 = r1; }
Остальное вроде выводится правильно.
Да, я это исправил, правда другим способом.

C++
1
2
3
4
Cone(double rad, double h1):Circle(r1) {
            H = h1;
            r1 = rad;
        }
Но опять же, как вывести на экран характеристики "противного" конуса.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void isLittle(Cone *obj) {
            cout << "1: Объем первого конуса: " << volume << " кубических единиц" << endl;
            cout << "2: Объем второго конуса: " << obj->volume << " кубических единиц" << endl;
 
            if (volume < obj->volume) {
                //cout << "Характеристики первого конуса: " << endl;
                cout << "Объем первого конуса меньше, чем объем второго" << endl;
            
                print_out();
            }
            else
                //cout << "Характеристики второго конуса: " << endl;
                obj->print_out();
            cout << "Объем первого конуса больше, чем объем первого" << endl;
            
        }
Вот тут он мне выводит только данные о конусе относительно этого сравнения
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2014, 19:16 6
Вот этот метод в классе зачем, вообще?
C++
1
void isLittle(Cone *obj)
1
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:20  [ТС] 7
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот этот метод в классе зачем, вообще?
Код C++
1
void isLittle(Cone *obj)

Препод сказал переделать так, чтобы в main вызывать

C++
1
m.isLittle(&n);
Если бы не это, этой темы на форуме не появилось бы.
0
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:26  [ТС] 8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты бредишь, а не учишься наследованию! Твои представления о наследовании в корне неверные!
У Дейтела видимо представления тоже неверны
Миниатюры
Базовый класс в иерархии наследования. Вывод свойств объектов  
0
Модератор
Эксперт С++
12105 / 9776 / 5910
Регистрация: 18.12.2011
Сообщений: 26,246
24.10.2014, 19:26 9
Лучший ответ Сообщение было отмечено MessageToBears как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void isLittle(Cone *obj) 
{
       cout << "1: Объем первого конуса: " << volume << " кубических единиц" << endl;
       cout << "2: Объем второго конуса: " << obj->volume << " кубических единиц" << endl;
 
       if (volume < obj->volume) 
       {
           cout << "Объем первого конуса меньше, чем объем второго" << endl;
       }else
       {
            cout << "Объем первого конуса больше, чем объем второго" << endl;
       }
       //cout << "Характеристики первого конуса: " << endl;
       print_out();
       //cout << "Характеристики второго конуса: " << endl;
       obj->print_out();
}
1
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.10.2014, 19:32 10
MessageToBears, Публичное наследование - это отношение is-a (является). Круг не является точкой. Следовательно наследование круга от точки - это бред, где бы это не было написано.
1
9 / 9 / 4
Регистрация: 05.12.2013
Сообщений: 65
24.10.2014, 19:42  [ТС] 11
Цитата Сообщение от ForEveR Посмотреть сообщение
MessageToBears, Публичное наследование - это отношение is-a (является). Круг не является точкой. Следовательно наследование круга от точки - это бред, где бы это не было написано.
http://snilit.tspu.ru/uploads/files/default/c.pdf

812-813 страница.

Я не претендую на истину, но в учебнике Дейтела написано именно так. Но и спорить я с Вами не буду.

Не очень приятно читать такое:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ты бредишь, а не учишься наследованию! Твои представления о наследовании в корне неверные!
Миниатюры
Базовый класс в иерархии наследования. Вывод свойств объектов  
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2014, 20:47 12
Хотите сравнивать конусы - перегрузите оператор сравнения.
Цитата Сообщение от MessageToBears Посмотреть сообщение
Препод сказал переделать так
Ну, раз препод... Тут оператор сравнения напрашивается.

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
MessageToBears, Публичное наследование - это отношение is-a (является). Круг не является точкой. Следовательно наследование круга от точки - это бред, где бы это не было написано.
ForEveR, интересно было бы послушать вашу дискусию с Дейтелами.
0
ForEveR
24.10.2014, 21:54
  #13

Не по теме:

alsav22, Хех, нет, спасибо, я глупее. Но is-a есть is-a.)

0
alsav22
24.10.2014, 22:04     Базовый класс в иерархии наследования. Вывод свойств объектов
  #14

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Но is-a есть is-a.)
Вот, вот... Уже начало...:)
Из чего-то же и они исходили.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2014, 22:04

Создать иерархии наследования
a) Создать иерархии наследования: воздушный транспорт, пассажирский транспорт - лайнер Boing...

Постоение иерархии наследования
нужно определить три класса: Expression — базовый класс иерархии, Number — для представления чисел...

Дженерики в сложной иерархии наследования
Имеется набор классов: public class LocalClass extends ALocalClass&lt;TypeClass&gt; {} public abstract...

Создать абстрактный базовый класс объектов на декартовой плоскости CShape и разработать иерархию классов конкретных фигур
Создать абстрактный базовый класс объектов на декартовой плоскости CShape (фигура). ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru