gpt4 book ai didi

c++ - Abstract 和 Derived 结合 std::list

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:43 24 4
gpt4 key购买 nike

我正在思考如何解决以下问题:

我有一个名为 Parent 的父类和许多名为 Child1、Child2 等 的子类。现在我最终想要做的是拥有一个 std::list 或某种容器来保存和访问一堆不同的子对象及其派生函数

例如:

Parent.h

class Parent
{
public:
Parent();

virtual void logic() = 0;

//strings and other members of every Child
}

Child1.h

class Child1 : public Gate
{
public:
Child1 ();
~Child1 ();
void logic();
};

Child1.cpp

void Child1::logic()
{ //Do Stuff }

现在假设我想要一个 std::list 或任何最适合我的抽象类 Parents 的容器

main.cpp

std::list <Parent> foo;

我将如何用不同类型的 Children 填充列表,我将如何遍历此列表并调用每个 Child 的 logic() 函数?

我阅读了大量关于使用 unique_ptr、使用 dynamic cast 或使用 vector 而不是列表的帖子,但在这一点上,我我只是比以前更困惑了。

最佳答案

使用 std::unique_ptr<Parent> 开始而不是 Parent否则你会遭受 object slicing .

接下来,只需用对象填充容器并调用它们的 logic() 即可。 ,例如:

std::vector<std::unique_ptr<Parent>> objects;
objects.push_back(std::make_unique<Child1>());
objects.push_back(std::make_unique<Child2>());
objects.push_back(std::make_unique<Child3>());

for(const auto& child : objects)
child->logic();

当然也可以对 std::list 做同样的事情但更喜欢std::vector在这里。


#include <iostream>
#include <memory>
#include <vector>
class Parent
{
public:
Parent() {}

virtual void logic() = 0;

//strings and other members of every Child
};

class Child1 : public Parent
{
public:
void logic() override { std::cout << "Hi from Child1." << std::endl; }
};

class Child2 : public Parent
{
public:
void logic() override { std::cout << "Hi from Child2." << std::endl; }
};

class Child3 : public Parent
{
public:
void logic() override { std::cout << "Hi from Child3." << std::endl; }
};

int main() {
std::vector<std::unique_ptr<Parent>> objects;
objects.push_back(std::make_unique<Child1>());
objects.push_back(std::make_unique<Child2>());
objects.push_back(std::make_unique<Child3>());

for(const auto& child : objects)
child->logic();
return 0;
}

Working example .

关于c++ - Abstract 和 Derived 结合 std::list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51456825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com