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

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

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

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

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

Добавлено через 2 минуты
Но ведь у переопределяемых функций количество параметров должно совпадать с количеством параметров у исходной виртуальной функции. Вот в чём дело... (
ValeryS
Модератор
6376 / 4842 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
10.12.2013, 01:15     Классы. Фигуры. Наследование #13
Цитата Сообщение от Лев Борисов Посмотреть сообщение
центр окружности и высота устанавливаются в классе Point, Цилиндр их наследует, так что из дополнительных параметров - только радиус.
ты видать не совсем разобрался с наследованием
класс это описание как например структура
и наследует он члены класса
а объект это уже физическая сущность и как ты создавая объект цилиндр задашь центр окружности и высоту
объект класса Point у тебя не создается
StackOverflow
All rights reserved.
91 / 81 / 5
Регистрация: 03.08.2013
Сообщений: 258
10.12.2013, 01:18     Классы. Фигуры. Наследование #14
Лев Борисов, вы храните часть данных в базовом классе, часть в родительском, часть в своём. Если вы приняли 6 параметров координат, 4 из них уйдут в родительский класс, две останутся в классе объекта. Родительский, в свою очередь, себе оставит две координаты, но сначала первые две передаст в базовы класс. Когда базовый класс установит все координаты, управление перейдёт в родительский класс. Тот отработает, передаст управление обратно классу вызывающего объекта, чтобы тот установил оставшиеся координаты. И вообще, зачем делать виртуальной set-функцию?
Лев Борисов
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; }
ValeryS
Модератор
6376 / 4842 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
10.12.2013, 01:25     Классы. Фигуры. Наследование #16
вот примерно так это выглядит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
public:
int a;
}
class B: public A
{
public:
int b;
}
class C :public B
{
public:
int c;
}
 
A oa;
B ob;
C oc;
объект oa будет содержать одну переменную a назовем её oa_a
объект ob две переменных a b ob_a ob_b
объект oc три переменных a b c oc_a oc_b oc_c

это все разные переменные они лежат в разных участках памяти
и если ты присвоишь oa_a допустим 5
то ob_a и oc_a не будут автоматически равны 5 им придется присваивать свои значения

Добавлено через 2 минуты
Цитата Сообщение от Лев Борисов Посмотреть сообщение
Я понял так, что конструктор Cylinder вызывает конструктор Point с инициализаторами элементов и задаёт начальное значение радиуса
правильно
только в данном случае Point это не отдельный объект а часть класса Cylinder
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:27  [ТС]     Классы. Фигуры. Наследование #17
Что-то я теперь даже в ступор вошёл, как это всё с полиморфизмом соединить, его ведь мне тоже надо использовать.
ValeryS
Модератор
6376 / 4842 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
10.12.2013, 01:35     Классы. Фигуры. Наследование #18
Цитата Сообщение от Лев Борисов Посмотреть сообщение
Что-то я теперь даже в ступор вошёл, как это всё с полиморфизмом соединить,
легко
только нужно понять что есть наследование
пример
есть класс человек
у него есть члены класса (поля) возраст рост ну и еще что нибудь
есть класс наследник мужчина он наследует все члены класса человек и добавляет свои например длинна бороды

а есть объекты класса мужчина
Лев Борисов, и ValeryS у нас есть все свойства(члены класса) класса мужчина
но значения в них разные
и есть только два объекта, не создается еще два объекта класса человек
просто мы одновременно и мужчина и человек
подвид, так сказать
Лев Борисов
2 / 2 / 0
Регистрация: 14.02.2013
Сообщений: 99
10.12.2013, 01:44  [ТС]     Классы. Фигуры. Наследование #19
Да, это понятно, но посмотрите ещё раз, пожалуйста, на код - разве я делаю как-то иначе? Ось - добавляю угол с двумя координатами - получаю параллелепипед.
К параллелепипеду добавляю ещё один угол и получаю треугольник в основании, то бишь тетраэдр.

Мне не стоит использовать setPoint, устанавливая и "базовые" значения через setParametr? Или я что-то снова не так понял?

Значит, никак нельзя, используя функцию setParamtr из Параллелепипеда, установить эти параметры в Тетраэдре???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2013, 01:52     Классы. Фигуры. Наследование
Еще ссылки по теме:

C++ Классы и наследование
C++ Классы и наследование
Наследование. Классы. C++ C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
10.12.2013, 01:52     Классы. Фигуры. Наследование #20
Цитата Сообщение от Лев Борисов Посмотреть сообщение
Мне не стоит использовать setPoint, устанавливая и "базовые" значения через setParametr?
да
все параметры для фигуры должны вводится одной функцией
Цитата Сообщение от Лев Борисов Посмотреть сообщение
Ось - добавляю угол с двумя координатами - получаю параллелепипед.
вот этого не понял
точка 0,0 высота 10
я ввожу 5,5 разве у меня получится параллелепипед?
и если введу потом 2,2 разве будет тетраэдр?
да и трудно как то из прямоугольников треугольники сделать
Yandex
Объявления
10.12.2013, 01:52     Классы. Фигуры. Наследование
Ответ Создать тему
Опции темы

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