2017-11-18 393 views
-2

我正在開發一個C++對象方向項目。我定義了一個向量作爲我ListOfShapes類私有變量:爲什麼我的C++向量在不遵守指針時使用空指針。

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 
}; 

形狀是父類的類名爲矩形:

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

}; 

在主函數創建其中包含推壓的指針(指向Shape對象)進入我上面提到的載體的功能的ListOfShapes對象。下面是調用函數的實現:

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

最後在這裏呼籲在主函數的作用:

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

我的代碼編譯罰款,甚至可以運行,如果我嘗試創建相同的向量(存儲指向Shape的指針)在主函數內。這個問題發生在addShape方法內部,當vector類中的push_back方法被調用時,出於某種原因它使用了空指針。我花了幾個小時試圖破壞這個問題,但我似乎無法找到它的原因。 我得到的錯誤是:

Debugger output

+2

'list-> addShape(r);' - 'list'指向哪裏?爲什麼不簡單地'ListOfShapes list;'? – PaulMcKenzie

+1

*我的代碼編譯良好,甚至運行* - 「編譯好」只意味着沒有語法錯誤。它對程序是否在邏輯上是正確的沒有影響。 – PaulMcKenzie

+0

非常感謝,我應該從一開始就意識到。問題解決了 – Hamza

回答

1

您正在訪問未初始化的指針list

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

如果你看看你的調試器輸出,可以看到this具有在一個奇怪的值addShape功能。這表明對象本身無效,而在無效對象內完成的任何操作也是無效的。

只需創建一個list本地對象。有沒有必要爲一個指針:

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

此外,您Shape類應該有虛析構函數。如果您試圖通過迭代list來存儲在list中的對象delete,則程序將調用未定義的行爲,因爲Shape沒有虛擬析構函數。