如何创建从同一类继承的不同对象的向量?
Posted
技术标签:
【中文标题】如何创建从同一类继承的不同对象的向量?【英文标题】:How do I create a vector of different objects that inherit from the same class? 【发布时间】:2020-02-21 17:19:37 【问题描述】:我有不同的对象,例如三角形、平面、球体等,它们都继承自 OBJECTS 类。我想创建这些不同对象的向量,然后遍历每个元素并对它们执行操作。我正在尝试制作光线追踪器,我想创建将许多不同的对象放到场景中,但我不知道如何。 OBJECTS 是一个抽象类,所以我不能创建向量,因为我可以创建它的实例。我应该创建一个全新的类并让所有形状类都继承自它吗?或者我应该重新制作对象类,使其不再是抽象的?帮助表示赞赏。我的下一个最佳猜测是对象指针。
【问题讨论】:
std::vector<std::unique_ptr<OBJECT>> objects;
?
【参考方案1】:
正如评论所建议的,你可以做这样的事情。
class Object
public:
virtual ~Object()= default;
virtual void foo() = 0;
;
class Pane: public Object
public:
~Pane() = default;
void foo() override
std::cout << "Hello Pane" << std::endl;
;
class Triangle: public Object
public:
~Triangle() = default;
void foo() override
std::cout << "Hello Triangle" << std::endl;
;
int main()
std::vector<std::unique_ptr<Object>> objects;
objects.emplace_back(std::make_unique<Triangle>());
objects.emplace_back(std::make_unique<Pane>());
for(auto &object: objects)
object->foo();
return 0;
只需创建一个 Objects-Pointers 向量。请注意,您不必使用unique_pointers
,但我强烈建议您这样做,因为您不需要在最后删除对象。
这个简单程序的输出是:
Hello Triangle
Hello Pane
【讨论】:
愚蠢的问题,但向量不会自动释放内存,或者这不适用于指针并导致指针悬空,因为指针指向内存位置? 如果您使用的是原始指针,您必须在该向量内的所有对象上调用 delete。所以没有内存不会自动释放。 又一个愚蠢的问题,析构函数不是自动调用的吗? 哦,好吧,这很有意义,谢谢。并澄清一下,所以智能指针会在超出范围时删除对象及其本身,对吗?谢谢顺便说一句。std::move(std::unique_ptr<Object>(new Triangle))
:没用的std::move
。也更喜欢std::make_unique<Triangle>()
而不是new
。以上是关于如何创建从同一类继承的不同对象的向量?的主要内容,如果未能解决你的问题,请参考以下文章