gpt4 book ai didi

c++ - 我应该如何使用带有 vector 和共享指针的派生类?

转载 作者:搜寻专家 更新时间:2023-10-31 00:40:46 26 4
gpt4 key购买 nike

我不熟悉继承的概念,我正在努力寻找解决以下问题的方法。

我有 2 个类(class),头类和手类。我主要将这些类的实例用作 vector 的元素。这两个类有共同的方法,也有它们独有的方法。

此外,我处理对象的共享指针。

我认为实现它的最好方法是创建一个 BodyPart 类,如下所示

class BodyPart
{
public:
typedef boost::shared_ptr<BodyPart> pointer;

private:
int commonMember1;
double commonMember2;

public:
int commonMethod1();
int CommonMethod2();
}

和这样的两个派生类

class Hand : public BodyPart
{
public:
typedef boost::shared_ptr<Hand> pointer;

private:
int numFingers;

public:
int getNumFingers();
void printInfo();
}

最后,我想声明一个 BodyPart 元素的 vector :

std::vector<BodyPart::pointer> cBodyParts;

包含 Hand 或 Head 元素,并在需要时调用 vector 元素上的方法。

但是这种方法似乎效果不是很好。显然,当我尝试获取 vector 的元素时,编译器提示它无法从 BodyPart 共享指针转换为 Hand 共享指针。此外,如果像上面那样声明 vector ,我就无法在其元素上调用特定于派生类的方法(如 getNumFinger() ),即使它们实际上来自该类。

有没有合适的方法来处理这个问题?还是我的方法完全错误?提前致谢!

最佳答案

您的方法是正确的,但编译器也是如此。拥有一个指向基类的共享指针 vector 很好,但您需要转换为实际类型以获得特定功能。

typedef boost::shared_ptr<Hand> pointer;虽然没用,你只需要 typedef在基类中。您不会在智能指针之间进行转换。我将基类 typedef 重命名为

typedef boost::shared_ptr<BodyPart> BodyPartPtr;

虽然。

Alan 在评论中的观点很好:您应该使基类的析构函数成为虚拟的以防止 UB,因为您将通过指向基类型的指针(间接地)删除指向派生类型的指针。

关于c++ - 我应该如何使用带有 vector 和共享指针的派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14157661/

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