gpt4 book ai didi

c++ - 从异构 std::list 中检索数据

转载 作者:行者123 更新时间:2023-11-30 04:19:28 24 4
gpt4 key购买 nike

在下面的代码中,我只是尝试使用一个异构 std::list 进行试验,我在其中将三个派生类对象存储在一个 Base* 类型的列表中。从列表中检索数据时,我遇到了一些问题。我该怎么做呢?下面的代码有效,因为所有三个类在定义上都是相同的。所以编译器以某种方式设法给我预期的输出。

#include <list>
#include <iostream>
#include <string.h>

class Base;
typedef std::list<Base*> any_list;

class Base{};

class Derived1 : public Base
{
public:
std::string s;
Derived1():s("D1"){}
};
class Derived2 : public Base
{
public:
std::string s;
Derived2():s("D2"){}
};
class Derived3 : public Base
{
public:
std::string s;
Derived3():s("D3"){}
};

int main(int argc, char **argv) {
any_list l;
l.push_back(new Derived1);
l.push_back(new Derived2);
l.push_back(new Derived3);

for(any_list::iterator itr=l.begin();itr!=l.end();++itr)
std::cout<<((Derived1*)*itr)->s;
}

请注意 o/p 是 -

D1 D2 D3

现在,如果我在任何类中添加一个额外的成员,这将不起作用(这是预期的并且是正确的)。那么我应该如何对数据进行类型转换并从异构列表中检索它呢?我在这里遗漏了什么吗?

最佳答案

最简单的方法可能是像这样定义 Base:

class Base {
public:
virtual const std::string& getData() = 0;
}

然后让您的各种派生类根据需要实现 getData()。这样,您的输出循环就可以是:

for (Base* b : l) {
cout << b->getData();
}

关于c++ - 从异构 std::list 中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15796341/

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