gpt4 book ai didi

c++ - 通过基类指针获取派生成员变量

转载 作者:行者123 更新时间:2023-11-27 23:42:16 41 4
gpt4 key购买 nike

考虑这个基类:

struct drawable 
{
virtual void draw(sf::RenderWindow &window) const = 0;

};

和这个派生类:

struct rectangle : drawable 
{
rectangle(sf::Vector2f pos, sf::Vector2f size);
void draw(sf::RenderWindow &window) const;
sf::RectangleShape body;
};

对于圆形、直线和三角形等其他形状,我有类似的派生类。我使用此函数根据从文件中获取的文本字符串返回形状:

drawable * string_to_object(std::string name)
{
if (name == "RECTANGLE")
{
return new rectangle(sf::Vector2f(20,20), sf::Vector2f(5,5));
}
else if (name == "BALL")
{
return new ball(sf::Vector2f(10,10), 5, sf::Vector2f(0,0));
}
else if (name == "LINE")
{
return new line(sf::Vector2f(30,30), 10, 5);
}
}

现在在我的 main 中,我有这样的变量来测试它是否有效:

auto game_object = string_to_object("BALL");

现在的问题是我需要对形状的主体执行操作/检查,它是我无法从可绘制指针变量访问的派生类的成员。未设置主体类型也是一个问题,它可以是 RectangleShape、CircleShape 等,因此 getBody() 函数需要可变返回类型。我将如何以通用方式访问 body ?我已经尝试过模板,但我意识到这是行不通的,因为这是一个运行时问题。

最佳答案

如果我正确理解你的问题,有多种方法可以解决这个问题。

  1. 重新思考您的架构。您可以将其他虚函数引入每个子类实现的可绘制对象。在这些函数中,您将实现所需的所有检查/操作。由于它们是在基类中实现的,因此它们可以访问形状的主体,并且由于它是基类的虚函数,您可以从外部调用这些函数。

  2. 由于您的可绘制对象具有虚函数,您可以使用 RTTI 在运行时检查类型并执行 dynamic_cast请参阅:https://en.wikibooks.org/wiki/C%2B%2B_Programming/RTTI

如果可能,我更喜欢第一个选项。

关于c++ - 通过基类指针获取派生成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53603644/

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