C++ 如何创建对象变量以便每次都分配新指针?

C++ 如何创建对象变量以便每次都分配新指针?,c++,visual-studio,oop,pointers,graphics,C++,Visual Studio,Oop,Pointers,Graphics,这是我关于Stackoverflow的第一个问题。我用C++在GP142上创建了一个绘图程序,我在重建画布方面遇到了麻烦。 加载程序时,它会请求点(或包含x和y的顶点),并通过连接所有这些点来创建形状(这是一个类)。我将点保存在点*向量中: vector<shape*> arr; 有5种不同的形状类型,它们都是在一个while(true)循环中创建的,该循环在菜单选择时终止。从菜单中选择“撤消”时,将删除上次创建的形状。 我正在使用以下命令删除它: line l(points,2)

这是我关于Stackoverflow的第一个问题。我用C++在GP142上创建了一个绘图程序,我在重建画布方面遇到了麻烦。 加载程序时,它会请求点(或包含x和y的顶点),并通过连接所有这些点来创建形状(这是一个类)。我将点保存在点*向量中:

vector<shape*> arr;
有5种不同的形状类型,它们都是在一个while(true)循环中创建的,该循环在菜单选择时终止。从菜单中选择“撤消”时,将删除上次创建的形状。 我正在使用以下命令删除它:

line l(points,2); //2 is num of points
l.draw();
arr.push_back(&l);
if (arr.size() > 0) {
    for (int i = 0;i < arr.size() - 1;i++) {
        arr[i]->draw();
    }
    arr.pop_back();
}
if(arr.size()>0){
对于(int i=0;idraw();
}
向后排列pop_();
}
当我撤消时,它会删除所有具有相同类型的形状。喜欢它删除我创建的所有行。是否有任何方法可以区分所有和其他变量,以便明确删除它们


谢谢。

要删除向量的最后一个元素
arr

if (!arr.empty())
    arr.pop_back();

我看到了几个问题。首先,您正在while循环中创建
s,因此当循环结束且行超出范围时,向量中的所有指针都将是悬空指针,即指向已销毁的
s。根据您的需求,您可以使用
std::unique\u ptr
s或
std::shared\u ptr
s来避免此问题。假设您选择共享的ptr,那么向量的类型应该是
std::vector
,并且在循环中您将拥有

auto a_line = std::make_shared<line>(points,2); //2 is num of points
a_line->draw();
arr.push_back(a_line);
auto a_line=std::使_共享(点,2)//2是点数
a_line->draw();
arr.push_back(一条线);
其次,要删除向量的最后一个元素,只要数组不是空的,就只需
arr.pop_back()

如果(arr.size()>0)实际上意味着相同