gpt4 book ai didi

c++ - 如何在 C++ 中创建良好的上下文类/返回引用?

转载 作者:行者123 更新时间:2023-11-28 06:55:03 25 4
gpt4 key购买 nike

我有 C# 背景,正在尝试创建结构良好的 C++ 应用程序(在本例中是使用 SFML 的游戏,但问题并不特定于任何与游戏相关的内容)。

当谈到传递参数和返回时,我习惯于按值赋值、按值引用、按引用赋值和按引用赋值。我认为这大致对应于以下内容,但如果我错了请纠正我。

(int    number) or (int    number) // value     by value
(someClass* c) or (someClass& c) // reference by value
(int* number) or (int& number) // value by reference
(someClass** c) or (someClass*& c) // reference by reference

为了实现适当的清理,我宁愿使用智能指针,我想知道我应该如何实现上下文类。

上下文类将包含并拥有游戏的多个组件,例如 Assets 管理器(加载和/或缓存资源)、场景引用等。此上下文类将包含对组件的只读引用,但组件不一定是只读的。

在 C# 中,合乎逻辑的选择是让 getter 检索对特定组件的引用。 IE。 AssetManager& getAssetManager() const;

目前为了存储它,我正在使用私有(private)字段 unique_ptr<AssetManager>在构造函数中初始化。所以清理应该发生在析构函数中。返回发生在 *fieldName .

它不需要是 shared_ptrAssetManager 的生命周期以来应该由 GameContext 控制.

问题 1: 这是从上下文类返回此类值的正确方法吗,还是我应该使用不同的构造(想到移动构造函数,但我对 C++ 的了解非常有限并且我不知道我现在是否有任何意义。)?

问题 2:我应该如何返回 sf::Font来自 AssetManager 的类(class).再次sf::Font& getFont(std::string name);似乎是一种选择,但该怎么做呢?

最佳答案

请注意表中的第 2 行和第 3 行:C++ 不要求您对 someClass* 和 int* 进行正式区分。

普遍接受的 OO 知识表明,除了类的组件(不是容器)的任何内容的不可变引用之外,返回任何内容都是禁止的,即使这样也应该仔细观察,因为它创建客户端和类之间的绑定(bind)。 “干净”的方法是在宿主类中有一组方法并将调用委托(delegate)给成员对象。当然,这也适用于成员的成员(AssetManagersf::Font)。

否则,返回一个引用比返回一个指针更可取,后者可能会也可能不会给接收者带来负责返回已分配内存的负担。

这是在不允许修改的情况下返回对成员的引用的典型方式:

private:
std::string name;
public:
const std::string& getName() const { return name; }

关于c++ - 如何在 C++ 中创建良好的上下文类/返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23296984/

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