Я не понимаю вывод, который я получаю для этой программы.

Программа наследования для class polygon который является базовым классом, и я создал прямоугольник вызова производного класса. В моем базовом классе многоугольника у меня есть конструктор и деструктор и два print функции для области и периметра. В моем производном классе у меня есть конструктор и деструктор и два print функции для области и периметра и calc area а также calc perimeter функции.
Чего я не понимаю, так это вывод, который я получаю при запуске этой программы прямо сейчас. Я хочу получить вывод area = 45 perimeter = 28, Я получаю этот вывод, когда я использую rect_1.calcarea() но хочу это используя rect_1.printarea(),

#include<iostream>
using namespace std;

class polygon
{

protected:
double area;
double perimeter;
public:
polygon(){}
virtual ~polygon(){ }
virtual double printarea() const { return area ;}
virtual double printperimeter() const { return perimeter ;}
};

class rectangle : public polygon
{

public:
rectangle(double , double ) ;
~rectangle(){ }
double calcarea() ;
double calcperimeter() ;
virtual double printarea() const { return area ;}
virtual double printperimeter() const { return perimeter ;}

private:
double length;
double width;
};

rectangle::rectangle(double l , double w)
{
length = l;
width = w;
}

double rectangle::calcarea()
{
area = length*width;
return area;
}

double rectangle::calcperimeter()
{
perimeter = length + width;
perimeter = perimeter * 2;
return perimeter;
}

void main ()
{
rectangle rect_1 (9.0, 5.0);

cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl;
cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl;

system("pause");
}

0

Решение

printarea() просто возвращает значение переменной-члена area, Вы а) ничего не инициализируете и б) нигде не вычисляете площадь.

Я бы рискнул предположить, что ваш вывод либо нулевой, либо мусорный — в зависимости от параметров компилятора — потому что область не инициализирована (то есть задано значение).

Если вы позвоните calcarea() внутри конструктора прямоугольника или в main после создания экземпляра этого экземпляра, затем printarea() даст правильное значение. Вы могли бы даже позвонить calcarea() внутри printarea() чтобы убедиться, что значение всегда актуально, когда это необходимо.

2

Другие решения

Попробуйте решение ниже. Это решит вашу проблему.

Вот что я изменил:
Я сделал Polygon как абстрактный класс, как вы хотите назвать только printarea или же printperimeter из Polygon, Кроме того, я позвонил calcarea а также calcperimeterсоответственно. Хотя то же самое можно сделать в теле printarea/printperimeter из Rectangle, Нет необходимости звонить calcarea а также calcperimeter,

#include<iostream>

using namespace std;

class polygon
{

protected:
double area;
double perimeter;
public:
polygon(){}
virtual ~polygon(){ }
virtual double printarea() = 0;
virtual double printperimeter() = 0;
};

class rectangle : public polygon
{

public:
rectangle(double , double ) ;
~rectangle(){ }
double calcarea() ;
double calcperimeter() ;
double printarea()  { return calcarea();}
double printperimeter() { return calcperimeter() ;}

private:
double length;
double width;
};

rectangle::rectangle(double l , double w)
{
length = l;
width = w;
}

double rectangle::calcarea()
{
area = length*width;
return area;
}

double rectangle::calcperimeter()
{
perimeter = length + width;
perimeter = perimeter * 2;
return perimeter;
}

void main ()
{
rectangle rect_1 (9.0, 5.0);

cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl;
cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl;

system("pause");
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector