2017-11-18 10 views
-2

私はC++オブジェクト指向プロジェクトに取り組んでいます。私のC++ベクタは、ポインタを参照しないときにnullポインタを使用するのはなぜですか?

vector<Shape*> list_of_shapes = {}; 

形状が別のクラスで、以下のことのヘッダファイルです:

class Shape{ 
private: 
    string color;//private variable 
public: 
    Shape(string c);//non-default constructor 
    string getColor();//returns color of the object 
    virtual void print() = 0;//pure virtual "print" function 
}; 

Shapeが呼ばれるクラスの親クラスである私は私のListOfShapesクラスのプライベート変数としてベクトルを定義し矩形:私は、上述したベクター(Shapeオブジェクトを指し示す)ポインタをプッシュ機能を含んListOfShapesオブジェクトを作成する主な機能で

class Rectangle:public Shape{ 
public: 
    Rectangle(const string &c,double length,double breadth); 
    void print(); 
private: 
    double length, breadth; 

}; 

。ここで呼び出される関数の実装です:

void ListOfShapes::addShape(Shape* s) { 
    list_of_shapes.push_back(s); 
} 

そして最後に、ここでは、main関数で呼び出すのアクションです:

int main() { 
    ListOfShapes* list; 
    Shape* r; 
    r = new Rectangle("red",1,1); 
    list->addShape(r); 
    return 0; 
} 

私のコードは正常にコンパイルし、私は同じことを作成しようとしても動作しますvector(メイン関数内にShapeへのポインタを格納する)この問題は、ベクタークラス内のpush_backメソッドが呼び出されたときに何らかの理由でnullポインタを使用しているときに、addShapeメソッド内で発生します。私はこの問題を取り除くために何時間も費やしましたが、その原因を見つけることはできません。私は取得しています エラーは次のとおりです。

Debugger output

+2

'list-> addShape(r);' - 'list'はどこに向いていますか?そしてなぜ単に 'ListOfShapes list;'? – PaulMcKenzie

+1

*私のコードはうまくコンパイルされ、実行されます。* - "コンパイルがうまくいく"とは、構文エラーがないことを意味します。プログラムが論理的に正しいかどうかは関係ありません。 – PaulMcKenzie

+0

ありがとう、私は最初から実現すべきだった。問題を解決しました – Hamza

答えて

1

あなたが初期化されていないポインタlistアクセスしている:あなたは、デバッガの出力を見れば、あなたはthisはで奇妙な値を持っていることがわかり

int main() { 
    ListOfShapes* list; 
    Shape* r; 
    r = new Rectangle("red",1,1); 
    list->addShape(r); // <-- list is not initialized, thus undefined behavior 
    return 0; 
} 

addShape機能。これは、オブジェクトそのものが無効であり、無効なオブジェクト内で行われたこともすべて無効であることを示します。

listローカルオブジェクトを作成するだけです。ポインタの必要はありません。

int main() { 
    ListOfShapes list; 
    Shape* r; 
    r = new Rectangle("red",1,1); 
    list.addShape(r); 
    return 0; 
} 

また、あなたのShapeクラスが仮想デストラクタを持つべきです。 listに格納されているオブジェクトをによってdeleteにしようとすると、プログラムはShapeに仮想デストラクタがないため、未定義の動作を呼び出します。

関連する問題