2017-11-18 247 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没有虚拟析构函数。