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

问题描述:

这是我在*上的第一个问题。我正在使用C++在GP142上创建一个绘图程序,而且我无法重新创建画布。 当加载程序,它要求(包含x和y或顶点)的点,并创建一个形状(这是一类)通过结合所有这些点。我将点保存在一个点*向量中:如何创建对象变量,以便每次都分配新的指针?

vector<shape*> arr; 

当一个形状完成时,它应该保存在向量数组中。我正在使用它来保存它:

line l(points,2); //2 is num of points 
l.draw(); 
arr.push_back(&l); 

有5种不同的形状类型,并且都是在一个while(true)循环内创建的,它终止于菜单选择。从菜单中选择撤消,最后创建的形状将被删除。 我使用其删除:

if (arr.size() > 0) { 
    for (int i = 0;i < arr.size() - 1;i++) { 
     arr[i]->draw(); 
    } 
    arr.pop_back(); 
} 

当我做撤消,它会删除所有同类型的形状。喜欢它删除我创建的所有。有没有我可以区分所有线和其他变量,因此他们可能被显式删除任何方法?

谢谢。

我看到一对夫妇的问题。首先,你在while循环中创建了line,所以当循环结束并且你的行超出范围时,向量中的所有指针都是悬挂指针,即指向已被销毁的line。根据您的要求,您可以使用std::unique_ptr s或std::shared_ptr s来避免此问题。假设你去shared_ptrs那么你的矢量的类型应该是std::vector<std::shared_ptr<shape>>,并在循环中,您将有

auto a_line = std::make_shared<line>(points,2); //2 is num of points 
a_line->draw(); 
arr.push_back(a_line); 

其次,去除矢量的最后一个元素,所有你需要做的就是arr.pop_back()提供的数组不空。

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

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

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