Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Класс. Наследование.


Автор: ioManip 13.10.2013, 05:03
Всем привет! Мне нужно прояснить одну ситуацию! 
У меня есть 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 */

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

Автор: ioManip 13.10.2013, 08:25
akizelokro, Так я комментирую не только вывод, но и создание самого объекта. Но результат все равно 50.

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

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

Код

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


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

Автор: ioManip 15.10.2013, 01:43
Я ничего не понял! smile 

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

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

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

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

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

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

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

не верны для Parllepiped, и переопределить не получится, т.к. не виртуальные
если уж хочешь общности, создай параллелепипед в N-мерном пространстве
а если хочешь использовать повторно то полезное, что есть в прямоугольнике, то параллелепипед включает прямоугольник как основание

Автор: akizelokro 15.10.2013, 07:33
Код

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

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

Автор: o2n3e 16.10.2013, 08:30
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)