1

SquareクラスのサブクラスであるクラスShapeを持つプログラムを作成しています

しかし、サブクラスが親クラスから変数にアクセスしようとすると、プログラムがクラッシュします。

これが私のコードです:

class Shape2D
{
public:
    string shape;
    void setShape(string newShape);
    string getShape();

    string specialType;
    void setSpecialType(string newSpecialType);

    vector <int> shapeXCoordi;
    void setshapeXCoordi(int newshapeXCoordi);

    vector <int> shapeYCoordi;
    void setshapeYCoordi(int newshapeYCoordi);
    void toString();

    virtual int computeArea()
    {
        return 0;
    }
    void displayArea();
};

テストの目的で、これcomputeArea()にx座標のみを返すようにします。

class Square : public Shape2D
{
public:
    int computeArea()
    {
        return shapeXCoordi[0];
    }
};

int main()
{
    if (aShape2D[0].getShape() == "Square")
    {
        Shape2D *pShape2D;
        pShape2D = &aSquare;

        cout << "Area: " << pShape2D -> computeArea()  << endl;
    } 
}

いくつかのテストを行いました。に変更return shapeXCoordi[0];するとreturn 123;、問題なく動作します。

私も試しreturn shape;ましたが、何も表示されませんが、今回はクラッシュしません。

だから、からSquareClassアクセスしようとすると何かがおかしいと思いますshapeXCoordi[0]ShapeClass

誰かがこの状況について私に教えてもらえますか?

4

1 に答える 1

0

最初に setshapeXCoordi を呼び出して、コンストラクターで shapeXCoordi を初期化する必要があります。初期化されていないベクトルである shapeXCoordi にアクセスしているため、要素はありません。したがって、[0] を使用してアクセスすると、エラーが返されます。

健全性チェックを computeArea() に追加して、アクセスする前に shapeXCoordi に要素があることを確認できます。

int computeArea()
{
    assert(shapeXCoordi.size() != 0);
    return shapeXCoordi[0];
}

また、[0] の代わりに .at(0) を使用することをお勧めします。これにより、クラッシュの代わりに実際のエラー処理が得られます。

于 2012-11-06T21:22:38.373 に答える