我可以从包含多个类对象的列表中获取内容吗?

时间:2013-03-19 17:00:55

标签: c++ list class

我有:

class Library
{
private:
list<Publication> L;
}
class Publication
{
protected:
string title;
string editor;
}

class Book:public Publication
{
private:
vector<string> Author;
}

当我在我的名单上插入一本书时,我失去了作者?如果不是,当我想显示列表中的一个出版物时,我想要显示出版物的作者。如何在不修改列表结构的情况下做到这一点?

2 个答案:

答案 0 :(得分:1)

如果不更改L的类型,则无法执行此操作。它是list<Publication> - 它存储Publication,而不是Book。如果您将Book推入其中,它将被切片,只留下Publication部分。

如果要以多态方式存储Publication,则需要使用指针或引用。我建议使用以下之一:

// When the Library has sole-ownership of a dynamically allocated Publication:
std::list<std::unique_ptr<Publication>> L;
// When the Library has shared-ownership of a dynamically allocated Publication:
std::list<std::shared_ptr<Publication>> L;
// When the Library wants a reference to a Publication:
std::list<std::reference_wrapper<Publication>> L;

如果出于任何原因你不能使用其中任何一个,你当然可以在L中存储原始指针。

答案 1 :(得分:1)

您正在存储Publication个对象,因此当您尝试存储Books时,您会获得object slicing。解决方案是将smart pointers存储到Publications。例如,

#include <memory>
class Library
{
private:
  std::list<std::unique_ptr<Publication>> L;
};