gpt4 book ai didi

c++ - 如何为作为基类存储在 std::vector 中的派生类编写重载函数

转载 作者:行者123 更新时间:2023-12-03 06:57:10 27 4
gpt4 key购买 nike

一直在尝试和寻找如何做到这一点,并需要一些帮助......

目标:有一个 std::vector 存储 Cat 和 Bear 对象(就像异构容器)。然后迭代 vector 并根据类型(猫/熊)执行重载函数 A 或函数 B

解决方案:我创建了一个基类(Animal),std::vector 存储这种类型的shared_ptrs。我创建动物派生的 Cat 或 Bear 对象(新),将它们的指针转换到 shared_ptr<Animal>并推送到 vector 。

问题:我有两个处理函数,分别采用 Cat 或 Bear 参数。但我需要std::static_pointer_cast<Bear>std::static_pointer_cast<Cat>在传递给函数之前,来自 vector 的 Animal 指针。我希望自动调用正确的函数(由于重载)。

谢谢

class AnimalClass
{
AnimalType type;
};

class Bear : public AnimalClass
{

}

class Cat : public AnimalClass
{
}

void action(Bear* bear)
{
run();
}

void action(Cat* cat)
{
stroke();
}


int main()
{
std::vector<shared_ptr<AnimalClass>> store;

// Populate store

Cat* cat= new Cat();
store.push_back(shared_ptr<AnimalClass>)cat );

Bear* bear= new Bear();
store.push_back(shared_ptr<AnimalClass>)bear );

// Process store

for (auto item : store)
{
action(item); // Does not compile unless item is static_pointer_cast to Bear or Cat, don't want to do that.
}

}

最佳答案

惯用的解决方案是使用 C++ 已经提供的开箱即用的虚拟调度。您需要将迄今为止的自由函数转换为虚拟成员函数,并在派生类中覆盖它们。示例:

#include <cstdio>

struct Animal
{
virtual void action() = 0;
};

struct Cat : Animal {
void action() override
{
std::puts("Cat::action");
}
};

struct Bear : Animal {
void action() override
{
std::puts("Bear::action");
}
};

您可以如下所示使用它们。

std::vector<std::shared_ptr<Animal>> store;

store.push_back(std::make_shared<Cat>());
store.push_back(std::make_shared<Bear>());

for (auto& item : store)
item->action();

请注意,我使用了 std::make_shared 来代替原始的 new。请注意,此时所有class都是struct,以避免过于频繁地输入public

关于c++ - 如何为作为基类存储在 std::vector 中的派生类编写重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64140931/

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