Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс. Наследование. Очень много текста! 
V
    Опции темы
ioManip
Дата 13.10.2013, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Всем привет! Мне нужно прояснить одну ситуацию! 
У меня есть 3 файла: main.cpp   rectangle.cpp    rectangle.h

Суть проблемы в том, что при подсчете объемма параллепипеда, значение площади всегда берется из конструктора по умолчанию класса Rectangle.
То есть смотрите, если закоментировать вот эти строчки:
Код

Rectangle recTwo;

 cout << "Площадь прямоугольника: " << recTwo.GetArea() << endl;
 cout << "Периметр прямоугольника: " << recTwo.GetPerimiter() << endl;
 cout << "Длина диагоналей прямоугольника: " << recTwo.GetDiagonal() << endl;

то значение площади все равно будет 50. А по идеи должно же быть 30 ?

main.cpp

Код

#include <iostream>
#include "Rectangle.h"

using namespace std;

int main() 
{
    Rectangle recOne(5, 6);
    Rectangle recTwo;
    
    cout << "Площадь прямоугольника: " << recOne.GetArea() << endl;
    cout << "Периметр прямоугольника: " << recOne.GetPerimiter() << endl;
    cout << "Длина диагоналей прямоугольника: " << recOne.GetDiagonal() << endl;
    
    cout << endl;
    
    cout << "Площадь прямоугольника: " << recTwo.GetArea() << endl;
    cout << "Периметр прямоугольника: " << recTwo.GetPerimiter() << endl;
    cout << "Длина диагоналей прямоугольника: " << recTwo.GetDiagonal() << endl;
    
    cout << endl;
    
    Parllepiped parOne(5, 6, 3, 4);
    Parllepiped parTwo;
    
    cout << "Объем параллепипеда: " << parOne.getVolume() << endl;
    cout << "Длина диагоналей параллепипеда: " << parOne.getDiagonal() << endl;
    
    cout << endl;
    
    cout << "Объем параллепипеда: " << parTwo.getVolume() << endl;
    cout << "Длина диагоналей параллепипеда:" << parTwo.getDiagonal() << endl;
      
    return 0;
}


rectangle.cpp

Код

#include <iostream>
#include <cmath>
#include "Rectangle.h"

using namespace std;

Rectangle::Rectangle(int A, int B)
{
    SetSideAB(A, B);
}

Rectangle::Rectangle()
{
    a = 5;
    b = 10;
}

void Rectangle::SetSideAB(int sideA, int sideB)
{
    a = sideA;
    b = sideB;
}

int Rectangle::GetArea()
{
    int resultArea = a * b;
    
    return resultArea;
}

int Rectangle::GetPerimiter()
{
   int resultPerimetr = 2 * (a + b);
    
   return resultPerimetr;
}

int Rectangle::GetDiagonal()
{
   int resultDiagonal = sqrt(a * a + b * b);
    
   return resultDiagonal;    
}

//---------------------------------------------------------//

Parllepiped::Parllepiped(int A, int B, int C, int H)
{
    SetSideABCH(A, B, C, H);
}

Parllepiped::Parllepiped()
{
    a = 5;
    b = 9;
    c = 7;
    h = 3;
}

void Parllepiped::SetSideABCH(int sideA, int sideB, int sideC, int height)
{
    a = sideA;
    b = sideB;
    c = sideC;
    h = height;    
}

int Parllepiped::getVolume()
{
    int resultVolume = GetArea() * h;
    
    return resultVolume;
}

int Parllepiped::getDiagonal()
{
    int resultDiagonal = sqrt(a * a + b * b + c * c);
    
    return resultDiagonal;
}


rectangle.h
Код

#ifndef RECTANGLE_H
#define    RECTANGLE_H

class Rectangle
{
public:
    Rectangle(int A, int B);
    Rectangle();
    ~Rectangle() {}
    
    void SetSideAB(int sideA, int sideB);
    int GetArea();
    int GetPerimiter();
    int GetDiagonal(); 
    
private:
    int a, b;
};

class Parllepiped: public Rectangle
{
public:
    Parllepiped(int A, int B, int C, int H);
    Parllepiped();
    ~Parllepiped() {}
    
    void SetSideABCH(int sideA, int sideB, int sideC, int height);
    int getVolume();
    int getDiagonal();
    
private:
    int a, b, c, h;
};

#endif    /* RECTANGLE_H */

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
akizelokro
Дата 13.10.2013, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Ничего не понял.
Первый прямоугольник у тебя со сторонами, которые ты задаешь при вызове конструктора с указанием сторон. Второй создаётся со значениями по умолчанию. Если ты уберёшь три строчки, в которых выводишь значение площади, то само значение площади не изменится. Просто ты отключаешь вывод значения.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ioManip
Дата 13.10.2013, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



akizelokro, Так я комментирую не только вывод, но и создание самого объекта. Но результат все равно 50.
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
akizelokro
Дата 13.10.2013, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Ничего не понимаю. Если ты комментируешь создание объекта (не создаёшь его), то и площади у него не должно быть, раз нет самого объекта. Или ты про первый прямоугольник rectOne, что у него площадь 50, а не 30?

Понял, ты про объём параллелепипеда.
Ну так у тебя нет конструктора вида 

Код

Parallpiped::Parallpiped(const Rectangle & rect, int side, int height)


вызывая который, ты бы создавал параллелепипед на основе уже созданного прямоугольника с произвольной длиной сторон. А когда ты создаешь параллелепипед ,указывая там члены a и b, они не изменяют  a и b из базового класса.
Просёк, что ты хотел сказать, вообщем. У тебя Parallpiped::a совсем не то, что Parallpiped::Rectangle::a.

Это сообщение отредактировал(а) akizelokro - 13.10.2013, 10:06


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ioManip
Дата 15.10.2013, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Я ничего не понял! smile 

UPD: Вообщем все решил вот так
Код

Parllepiped::Parllepiped(int A, int B, int C, int H):Rectangle(A, B)

akizelokro Возможно, Вы именно это имели ввиду!

UPD2 А хотя подождите, вроде не так smile

Это сообщение отредактировал(а) ioManip - 15.10.2013, 02:58
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
baldina
Дата 15.10.2013, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(ioManip @  13.10.2013,  05:03 Найти цитируемый пост)
class Parllepiped: public Rectangle

плохое решение: параллелепипед это не прямоугольник.
да и значения
Код

    int GetArea();
    int GetPerimiter();
    int GetDiagonal(); 

не верны для Parllepiped, и переопределить не получится, т.к. не виртуальные
если уж хочешь общности, создай параллелепипед в N-мерном пространстве
а если хочешь использовать повторно то полезное, что есть в прямоугольнике, то параллелепипед включает прямоугольник как основание
PM MAIL   Вверх
akizelokro
Дата 15.10.2013, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

Parllepiped::Parllepiped(int A, int B, int C, int H):Rectangle(A, B)

Можно и так. Просто тема немного в другом, при наследовании, ты должен понимать, переменная а, член  класса Rectangle, при наследовании будет наследоваться классом Parllepiped. Но она не та переменная a, которую ты определяешь в классе Parllepiped (в твоей модели у тебя две переменные a, одна член класса Parllepiped, а вторая переменная a наследуется из класса Rectangle).
Если ты хочешь, чтобы у тебя была одна переменная a, то выбрось определение из Parllepiped.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
o2n3e
Дата 16.10.2013, 08:30 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.8.2011

Репутация: -4
Всего: -5




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1112 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.