如何创建对象变量,以便每次都分配新的指针?
问题描述:
这是我在*上的第一个问题。我正在使用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();
如果(arr.size()> 0) 实际上意味着同一 –