0

基本クラスである継承プログラムとclass polygon、派生クラス呼び出し長方形を作成しました。私のポリゴン基本クラスには、コンストラクタとデストラクタ、およびprint面積と周囲の 2 つの関数があります。私の派生クラスには、コンストラクタとデストラクタ、およびprint面積と周囲の 2 つの関数calc areacalc 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");
}
4

2 に答える 2

2

printarea()メンバー変数の値を返すだけですarea。あなたはa)それを何にも初期化しておらず、b)どこにも面積を計算していない。

エリアが初期化されていない(つまり値が指定されている)ため、コンパイラのオプションに応じて、出力がゼロまたはガベージであると推測するのは危険です。

calcarea()長方形のコンストラクター内、またはそのインスタンスをインスタンス化した後にmainで呼び出すとprintarea()、正しい値が生成されます。calcarea()内部に電話printarea()して、必要なときに値が常に最新であることを確認することもできます。

于 2012-12-18T04:04:17.477 に答える
0

以下の解決策を試してください。これで問題は解決します。

ここに私が変更したものがあります:私
は Polygon を抽象クラスとして作成しました。さらに、それぞれ と を呼び出しました。/ ofの本体でも同じことができますが。とを呼び出す必要はありません。printareaprintperimeterPolygoncalcareacalcperimeterprintareaprintperimeterRectanglecalcareacalcperimeter

#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");
}
于 2012-12-18T05:03:20.130 に答える