为什么我的C++;向量在我不遵从指针时使用空指针。 我正在研究一个C++对象定位项目。我在ListOfShapes类中将向量定义为私有变量: vector<Shape*> list_of_shapes = {};

为什么我的C++;向量在我不遵从指针时使用空指针。 我正在研究一个C++对象定位项目。我在ListOfShapes类中将向量定义为私有变量: vector<Shape*> list_of_shapes = {};,c++,oop,pointers,vector,polymorphism,C++,Oop,Pointers,Vector,Polymorphism,Shape是名为Rectangle的类的父类: class Rectangle:public Shape{ public: Rectangle(const string &c,double length,double breadth); void print(); private: double length, breadth; }; 在主函数中,我创建了一个ListOfShapes对象,其中包含一个函数,该函数将指针(指向形状对象)推送到我上面提到的向量中。

Shape是名为Rectangle的类的父类:

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

};
在主函数中,我创建了一个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;
}
最后是调用main函数的操作:

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;
}
如果我尝试在主函数中创建相同的向量(存储指向形状的指针),我的代码编译得很好,甚至可以运行。问题发生在addShape方法内部,当调用vector类内部的push_back方法时,出于某种原因,它使用了空指针。我花了几个小时试图解决这个问题,但我似乎找不到它的原因。 我得到的错误是:


您正在访问未初始化的指针
列表

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

另外,您的
Shape
类应该有一个虚拟析构函数。如果您试图通过迭代
list
删除
list
中存储的对象,由于
Shape
没有虚拟析构函数,程序将调用未定义的行为。

list->addShape(r)-
列表
指向哪里?为什么不干脆
ListOfShapes列表?我的代码编译得很好,甚至可以运行--“编译得很好”只意味着没有语法错误。这与程序逻辑是否正确无关。非常感谢,我从一开始就应该意识到这一点。问题solved@PaulMcKenzie如果你不介意的话,我还有一个关于同一个项目的问题。假设我要放置线:Shape*r;r=新矩形(“红色”,1,1);函数内部。我知道指针形状*在函数执行后会被破坏。你有什么建议不在main中创建另一个全局指针数组就可以继续吗?没有,对象不会被破坏。由于您正在使用
new
(这是另一个问题,但这不是重点),因此对象将继续存在,直到您调用
delete