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

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

Войти
Регистрация
Восстановить пароль
 
 
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
#1

Классы. Фигуры. Наследование - C++

10.12.2013, 00:46. Просмотров 1519. Ответов 21
Метки нет (Все метки)

Создан абстрактный класс Point - ось в трёхмерном пространстве с начальной точкой и высотой.
Производный от него Параллелепипед - принимает два параметра (координаты Х У) для установки противоположной начальной точкой вершиной.
Производный от Параллелепипеда - Тетраэдр - принимает ещё два параметра (координаты Х У третьего угла).

Проблема: как установить все четыре параметра в Тетраэдре, если виртуальная функция установки параметров принимает только два значения. Так же имеются фигуры Конус, Цилиндр, Пирамида, тут проблем нет.

Помогите, пожалуйста!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Point {
// Спецификаторы доступа к элементам
public:                                         // Доступны при любом обращении программы к объекту класса Time
                                                // Открытые методы / Открытый интерфейс услуг класса / Прототипы
                                                // Будут использоваться "клиентами" класса
    Point(int = 0, int = 0, int = 0, int = 0);  // Конструктор
                                                // Инициализирует данные-элементы объекта этого класса
    void setPoint (int, int, int, int);         // "Set" - установить
    void greet() const;                         // Сообщение о введении начальных параметров
    virtual void greet_2() const = 0;           // Чисто виртуальная функция печати предложения ввода параметров
    virtual void print() const = 0;             // Чисто виртуальная функция печати имени класса
    virtual void setParameter(int, int) = 0;    // Чисто виртуальная функция установки параметров
    virtual float getArea() const = 0 ;         // Чисто виртуальная функция подсчёта площади
protected:                                      // Доступны для производных классов
    int x0, y0, z0, high;                       // Координаты начальной точки
};                                              // Высота
C++
1
2
3
4
5
6
7
8
9
10
class Parallelepiped : public Point {   // Открытое наследование (Тип наследования)
public:
    Parallelepiped(int = 0, int = 0, int = 0, int = 0, int = 0, int = 0);
    virtual void print() const;
    virtual void greet_2() const;
    virtual void setParameter(int, int);// Установка противоположной вершины
    virtual float getArea() const;      // Вычисление площади
protected:                              // Доступны только функциям-элементам (методам) этого класса
    int x1, y1;
};
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
// PARALLELEPIPED.CPP
// Функции-элементы / Методы класса Parallelepiped
#include "StdAfx.h"
#include "iostream"
#include <cmath> 
#include "Parallelepiped.h"
 
using namespace std; 
 
/* Конструктор Parallelepiped вызывает конструктор Point с инициализаторами элементов,
затем инициализирует координаты второй точки */
Parallelepiped::Parallelepiped(int x_1, int y_1, int x, int y, int z, int h)
: Point(x, y, z, h)                             // Вызов конструктора базового класса
{ x1 = x_1; y1 = y_1; }
 
void Parallelepiped::print() const
{ cout << "\n\tПараллелепипед"; }
 
void Parallelepiped::greet_2() const
{ cout << "\tВведите координаты противоположной вершины: "; }
 
void Parallelepiped::setParameter(int x_1, int y_1)
{ x1 = x_1; y1 = y_1; }
 
// Вычисление площади класса Parallelepiped
float Parallelepiped::getArea() const
{ return abs((x1 - x0) * (y1 - y0)); }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// TETRAHEDRON.H
// Определение класса Tetrahedron
 
#ifndef TETRAHEDRON_H
#define TETRAHEDRON_H
#include "Parallelepiped.h"
 
class Tetrahedron : public Parallelepiped { 
                                            // Открытое наследование (Тип наследования)
public:
    Tetrahedron(int = 0, int = 0, 
                int = 0, int = 0, 
                int = 0, int = 0, 
                int = 0, int = 0);
    virtual void print() const;
    virtual void greet_2() const;
    virtual void setParameter(int, int);;   // Установка координат двух вершин
    virtual float getArea() const;          // Вычисление площади
private:
    int x2, y2;
};
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
// TETRAHEDRON.CPP
// Функции-элементы / Методы класса Tetrahedron
#include "StdAfx.h"
#include "iostream"
#include <cmath> 
#include "Tetrahedron.h"
 
using namespace std; 
 
/* Конструктор Tetrahedron вызывает конструктор Point с инициализаторами элементов
с помощью инициализаторов элемента и задаёт начальное значение радиуса */
Tetrahedron::Tetrahedron(int x_2, int y_2, int x1, int y1, int x, int y, int z, int h)
: Parallelepiped(x1, y1, x, y, z, h)
{ x2 = x_2; y2 = y2; }
 
void Tetrahedron::print() const
{ cout << "\n\tТетраэдр"; }
 
void Tetrahedron::greet_2() const
{ cout << "\tВведите координаты противоположной вершины: "; }
 
void Tetrahedron::setParameter(int x_2, int y_2)
{ x2 = x_2; y2 = y_2; }
 
// Вычисление площади класса Tetrahedron
float Tetrahedron::getArea() const
{ return 1.0 * abs( (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)) / 2; }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2013, 00:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Классы. Фигуры. Наследование (C++):

Наследование, базовые классы и производные классы - C++
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и собственные компоненты производных...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) - C++
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию...

Классы и наследование - C++
Доброго времени суток. Помогите решить задание. Дан класс pegasus ,у которого родительский класс horse, надо переделать код, чтобы при...

Классы и наследование - C++
Реализовать класс−оболочку Number для числового типа double. Реализовать методы умножения и вычитания. Создать производный класс Real, в...

Классы, наследование - C++
как сделать, что бы вызывался деструктор B? Кроме как &quot;delete (B*)var;&quot; class A { public: A(){ cout &lt;&lt; &quot;A's...

Классы и их наследование - C++
Начал изучать С++ и ООП после того как понял немного осоновы. И вот столкнулся с чем. Есть базовый класс, есть класс-наслденик, базовый...

21
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
10.12.2013, 00:57 #2
Почему у вас ВСЕ функции виртуальные?
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
10.12.2013, 01:03 #3
Цитата Сообщение от Лев Борисов Посмотреть сообщение
Проблема: как установить все четыре параметра в Тетраэдре, если виртуальная функция установки параметров принимает только два значения.
добавь еще два параметра по умолчанию
как то так
C++
1
virtual void setParameter(int x1, int y1, int x2=0, int y2=0) = 0;
0
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:04  [ТС] #4
Потому что я их переопределяю в каждом классе.
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
10.12.2013, 01:04 #5
Цитата Сообщение от Лев Борисов Посмотреть сообщение
оздан абстрактный класс Point - ось в трёхмерном пространстве с начальной точкой и высотой.
а ты уверен что слово Point означает ось? по моему это точка
0
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:06  [ТС] #6
Да, такой вариант я рассматривал, но плохо то, что, допустим, для того же цилиндра функций setParameter мне нужно установить лишь радиус, тогда придётся просто посылать оставшиеся ПЯТЬ переменных в трубу. Хотелось бы избежать и сделать как-то иначе.
0
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
10.12.2013, 01:06 #7
Я к чему, сделайте в базовом классе виртуальную функцию с некоторым именем, а у потомков можете запросто эти функции переопределить под их собственные нужды. Компилятор сам разберётся, какую функцию вызвать в зависимости от типа вызывающего объекта.
0
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:07  [ТС] #8
Да, детали синтаксиса, думаю, это не очень страшно.
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
10.12.2013, 01:08 #9
Цитата Сообщение от Лев Борисов Посмотреть сообщение
setParameter мне нужно установить лишь радиус,
не понял?
а высота? центр окружности?

Добавлено через 1 минуту
Цитата Сообщение от Лев Борисов Посмотреть сообщение
Да, детали синтаксиса, думаю, это не очень страшно.
ну как сказать
потом забудешь что Point это ось, или кто другой с твоим листингом работать будет
0
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:09  [ТС] #10
Именно, я понимаю! Но ведь у переопределяемых функций количество параметров должно совпадать с количеством параметров у исходной виртуальной функции. Вот в чём дело...
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
10.12.2013, 01:10 #11
что то не понял сообщение затерялось
повторю
setParameter виртуальной делать не надо она у каждого класса своя
0
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:13  [ТС] #12
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял?
а высота? центр окружности?

Добавлено через 1 минуту
центр окружности и высота устанавливаются в классе Point, Цилиндр их наследует, так что из дополнительных параметров - только радиус.

Добавлено через 2 минуты
Но ведь у переопределяемых функций количество параметров должно совпадать с количеством параметров у исходной виртуальной функции. Вот в чём дело... (
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,187
10.12.2013, 01:15 #13
Цитата Сообщение от Лев Борисов Посмотреть сообщение
центр окружности и высота устанавливаются в классе Point, Цилиндр их наследует, так что из дополнительных параметров - только радиус.
ты видать не совсем разобрался с наследованием
класс это описание как например структура
и наследует он члены класса
а объект это уже физическая сущность и как ты создавая объект цилиндр задашь центр окружности и высоту
объект класса Point у тебя не создается
0
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
10.12.2013, 01:18 #14
Лев Борисов, вы храните часть данных в базовом классе, часть в родительском, часть в своём. Если вы приняли 6 параметров координат, 4 из них уйдут в родительский класс, две останутся в классе объекта. Родительский, в свою очередь, себе оставит две координаты, но сначала первые две передаст в базовы класс. Когда базовый класс установит все координаты, управление перейдёт в родительский класс. Тот отработает, передаст управление обратно классу вызывающего объекта, чтобы тот установил оставшиеся координаты. И вообще, зачем делать виртуальной set-функцию?
1
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:20  [ТС] #15
Я понял так, что конструктор Cylinder вызывает конструктор Point с инициализаторами элементов и задаёт начальное значение радиуса

C++
1
2
3
Cylinder::Cylinder(int x, int y, int z, int h, int r)
: Point(x, y, z, h)                             // Вызов конструктора базового класса
{ radius = r > 0 ? r : -r; }
0
10.12.2013, 01:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2013, 01:20
Привет! Вот еще темы с ответами:

Классы, наследование - C++
Доброго времени суток! Объясните пожалуйста, как работает операция &quot;::&quot; на примере этой программы. И работу конструкции Time::Time() : ...

Классы и наследование. - C++
Здравствуйте,выручите решением,пожалуйста. Задача : Создать произвольный класс,путем наследования создать два дочерних класса.

Классы. Наследование - C++
Приветствую всех участников форума! Требуется помощь. Итак, задание Написать программу, демонстрирующую работу с объектами двух...

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


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

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

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