0

これは私のコードです:

/*
create an abstract class shape and derived classes rectangle and circle from class shape, implement abstract method of class shape in rectangle and circle. Class circle contains radius as data members rectangle class contains length and breadth.
 */

class shape
{

              virtual void displayArea() = 0;
              virtual void get_radius(double r) = 0;
              virtual void get_length(double a) = 0;
              virtual void get_breadth(double b) = 0;
};

class rectangle: public shape
{

      protected:

                double length;
                double breadth;
      public:
             virtual void get_length(double a)
             {
                     length = a;
             }
             virtual void get_breadth(double b)
             {
                     breadth = b;
             }
             virtual void get_radius(double r)
             {
                     cout << endl;
             }
             virtual void displayArea()
             {
                     cout << "Area of RECTANGLE = " << length*breadth << endl;
             }
};

class circle: public shape
{

      protected:
                double radius;
      public:
              virtual void get_length(double a)
             {
                     cout << endl;
             }
             virtual void get_breadth(double b)
             {
                     cout << endl;
             }
             virtual void get_radius(double r)
             {
                     radius = r;
             }
             virtual void displayArea()
             {
                     cout << "Area of circle = " << 3.14*radius*radius << endl;
             }
};

int main()
{

    shape* shapes;
    double l, r, b;
    rectangle R;
    circle C;

    cout << "Enter the length and breadth for rectangle\n" << endl;
    cin >> l >> b; 
    cout << "\nEnter the radius of circle\n " << endl;
    cin >> r;
    R.get_length(l);
    R.get_breadth(b);
    C.get_radius(r);

    shapes[0] = R;
    shapes[1] = C;

    shapes[0].displayArea();
    shapes[1].displayArea();

    system("pause");
    return 0;
}

コンパイルエラーは発生していませんが、実行時にこれが発生します: 長方形の長さと幅を入力してください

3 3

円の半径を入力してください

3

その後、しばらく一時停止してから終了します。私は混乱しています。ここで何が間違っていて、どうすれば修正できますか? また、コードにはどのような問題がありますか?

4

4 に答える 4

3

あなたのshapes変数は初期化されていません(配列だと思います)。オブジェクトのアドレスで初期化する必要があります:

shape* shapes[2] ;
//...

shapes[0] = &R;
shapes[1] = &C;

shapes[0]->displayArea();
shapes[1]->displayArea();
于 2012-09-02T21:01:06.980 に答える
1

まず、コンストラクターやセッター関数がないため (少なくともそれらのコードは表示されていません)、クラス メンバー変数を設定する方法はありません。

第二に、あなたはこれを行うことができません

shape* shapes;
shapes[0] = R;
shapes[1] = C;

形状は、メモリを割り当てていないポインターであるためです。形状ポインターの配列が必要な場合は、形状を配列として宣言する必要があります。ポインターの配列である場合は、ポインターをオブジェクトではなくその要素に割り当てる必要があります。

編集実際にはセッター関数があり、それらを呼び出していることがわかりますget_length() get_radius()。これは非常に紛らわしく、可能な場合は何をするかを示す変数名を使用することをお勧めします。あなたのコードを読んでいる人にとって、これは非常に混乱しています

于 2012-09-02T21:01:46.220 に答える
0

あなたのコードについて気づいたことの 1 つは、'shapes' が実際には配列ではないことです。初期化されていないポインタです。したがって、shapes[0]=R は member#0 を R に向けるのではなく、ポインターが指す場所にコピーします。次の行も同様のことを行います。これにより、メモリが破損する可能性があります。あなたはおそらく次のようなものが欲しい

shape* Shapes[2];

または(この行を C と R が宣言された場所の後に移動します):

shape** Shapes = {
    &R,
    &C
};
于 2012-09-02T21:07:24.073 に答える
0

この線

shape* shapes;

シェイプ オブジェクトへのポインターを宣言します。ただし、どの形状にもメモリを割り当てていません。次に、後でこのポインターを配列として使用します。

shapes[0] = R; 
shapes[1] = C; 

このメモリ位置はプログラムで使用するために割り当てられていないため、これにより未定義の動作が発生します。

于 2012-09-02T21:03:24.500 に答える