【问题标题】:How to use stl with inheritance?如何使用带有继承的stl?
【发布时间】:2021-10-27 10:10:41
【问题描述】:

当参数是基本结构的列表时,如何调用具有不同参数的函数,而在调用函数时,参数是继承结构的列表。

甚至有可能吗?我有错误

no known conversion from list<Stats> to list<MyStats>

如果有人知道如何正确命名这个问题,甚至重新表述它,请这样做。

struct Stats{
    int number;
};
struct MyStats:Stats{
    char letter;
};
using namespace std;

std::list<Stats> extractFirstBatch(std::list<Stats> stats){
    int counter=0;
    std::list<Stats> batch;
    for(const auto&s: stats){
        counter++;
        batch.push_back(s);
        if(counter>10)
            break;
    }
    return batch;
}
int main()
{
    std::list<MyStats> stats;
    MyStats s;
    s.number=1;
    stats.push_back(s);
    //error no matching function for call to 'extractFirstBatch'
    //no know conversion from list<Stats> to list<MyStats>
    QList<Stats> newStats=extractFirstBatch(stats);
    return 0;
}

【问题讨论】:

  • 让我们假设(为了讨论,因为-正如您所说-您不能)您想要的转换类型是可能的。你有一个std::list&lt;Stats&gt;,它可以以某种方式转换为std::list&lt;MyStats&gt;。如果您访问std::list&lt;MyStats&gt; 的元素,您希望这些元素的letter 成员具有什么值?您的期望(可能特定于您对MyStatsStats 类型的特定理解)是否与可能存储在std::list 中的所有其他类型相关?

标签: c++ stl


【解决方案1】:

stl如何使用继承?

与使用继承的变量相同。你使用间接。

Stats 类型的变量始终是 Stats 类型,而不是某些派生类型。同样,容器std::list&lt;Stats&gt; 的元素始终是Stats 类型,而不是某个派生类型。

要拥有运行时多态性,我们可以使用间接。如果我们有一个引用或指向Stats 的指针,它可能是Stats 的独立实例,或者我们可能指的是派生类型的基本子对象。所以,让我们在容器中使用存储指针:std::list&lt;std::shared_ptr&gt;。如果您想将所有权保留在其他地方并且知道生命周期不会有问题,您也可以使用非拥有指针。或者,如果您将Stats::~Stats 设为虚拟,那么您可以使用唯一指针。

【讨论】:

    【解决方案2】:

    使用标准库:

    std::list<MyStats> result;
    std::copy_n(stats.begin(), 10, std::back_inserter(result));
    

    std::back_inserter 返回一个附加到容器的迭代器。 std::copy_n 复制指定数量的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2011-12-09
      • 2017-01-28
      相关资源
      最近更新 更多