gpt4 book ai didi

c++ - 如何从纯虚基类函数访问派生成员?

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:12 25 4
gpt4 key购买 nike

我想要一个 Collider 接口(interface)类,其中将有一个重载的 -> 运算符以直接访问 BoxCollider 派生类。我想通过界面访问 box collider 的成员,并在运行时更改 collider 的类型。所以我想到了使用模板:

template<typename T>
class ColliderV2 {
public:
virtual T* operator ->() = 0;
};

class BoxColliderV2 : public ColliderV2<BoxColliderV2> {
public:
float width;
float height;

BoxColliderV2* operator ->() {
return this;
}


};
int main()
{
ColliderV2<BoxColliderV2>* col = new BoxColliderV2;
(*col)->width = 1;

}

这行得通。但是据我所知,templates 会在编译时生成一个全新的 Collider 类,用 Box Collider 填充 T,对吗?这就是它起作用的原因。但后来它阻止我改变对撞机类型。我还想过用 Collider* operator->() ; 创建一个虚拟 Collider 类派生类中的重载 BoxCollider* operator->() ;

但如果我尝试过:

Collider<BoxCollider>* col = new BoxCollider;
(*col)->width = 1; // won't work

不起作用,因为 Collider 不是 BoxCollider。而且我不想 dynamic_cast 我可能拥有的每一种可能的对撞机类型。那么,在这里可以做什么?

最佳答案

正如您已经发现的那样,这是行不通的。模板和运行时行为是一种矛盾的机制。您不能创建一个公共(public)基类并让它像一个通用指针一样让您访问其派生类型的成员。

接口(interface)指定了您可以根据其进行编码的契约。您不是针对特定实现而是针对接口(interface)进行编码,因此接口(interface)必须提供您想要访问的所有成员。在您的情况下,这将导致 widthheight 成为 ColliderV2 而不是 BoxColliderV2 的一部分。但是,这会破坏您试图模仿的逻辑。

您可以采用以下几种方法:

  1. 要么让你的对撞机类型变体,比如

    using ColliderType = std::variant<BoxColliderV2, MyOtherCollider, ...>;

    并在访问成员时检查实际类型

    ColliderType myCollider = /* generate */;

    if (auto boxCollider = std::get_if<BoxColliderV2>(&myCollider); boxCollider)
    boxCollider->width = 0;
  2. 或者,保留您拥有的基类,删除 operator-> 和模板并对其进行动态转换:

    ColliderV2* col = new BoxColliderV2;
    if (auto boxCollider = dynamic_cast<BoxColliderV2*>(col); boxCollider)
    boxCollider->width = 0;
  3. 您还可以将诸如 widthheight 之类的详细信息隐藏在作为界面一部分的更通用的函数后面。例如:

    class ColliderV2 {
    public:
    virtual void setBounds(float width, float height) = 0;
    };

    class BoxColliderV2 : public ColliderV2 {
    public:
    void setBounds(float width, float height) override {
    this->width = width;
    this->height = height;
    }

    private:
    float width;
    float height;
    };

    int main()
    {
    ColliderV2* col = new BoxColliderV2;
    col->setBounds(1, 1);
    }

关于c++ - 如何从纯虚基类函数访问派生成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59520829/

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