C++ 在函数外使用基类指针
Posted
技术标签:
【中文标题】C++ 在函数外使用基类指针【英文标题】:C++ Using base class pointers outside of function 【发布时间】:2016-06-14 02:13:32 【问题描述】:我有一个基类和几个派生类。之前我使用一个容器来管理一个对象,但现在我可以在这种情况下拥有几种不同类型的学生,这意味着我决定使用基类指针来管理它。但是我不确定如何在创建它的函数之外处理对象。以下是我之前为管理对象所做的。有没有类似用基类指针管理容器的东西?
pointer = new SchoolChild[NoOfChildren];//creates pointer that free up space on memory
for (int i = 0; i < NoOfChildren; i++)
pointer[i].display();
【问题讨论】:
这只是创建一个数组来存储您的 SchoolChild 对象指针。将其更改为基类,然后您将拥有一个基指针数组。在其他地方,您需要将新的 SchoolChild 对象和任何其他派生类型设置到基本指针数组中。这需要在您尝试在每个数组条目上调用 display() 之前发生,否则它会尝试在 NULL 上调用 display() 方法。 【参考方案1】:通常,您会从管理 值 的 数组 转移到 指针 的 数组:
// from this (pointer to SchoolChild)
SchoolChild* children = new SchoolChild[NoOfChildren];
children[0].name = "name";
// to this (pointer to SchoolChild pointer)
SchoolChild** children = new SchoolChild*[NoOfChildren];
children[0] = new SchoolChild; // allocate each element
children[0]->name = "name";
您还有更多的删除工作要做,需要删除数组的每个元素以及数组本身。
for(int i = 0; i < NoOfChildren; ++i)
delete children[i]; // delete each element
delete[] children; // delete[] the array itself
最好使用 容器 和 智能指针 为您管理所有这些:
std::vector<std::unique_ptr<SchoolChild>> children(NoOfChildren);
children[0]->name = "name";
这里不需要删除任何内容,因为std::unique_ptr
s 将删除包含的SchoolChild
对象,而std::vector
将删除std::unique_ptr
元素。
【讨论】:
以上是关于C++ 在函数外使用基类指针的主要内容,如果未能解决你的问题,请参考以下文章