【问题标题】:Effective way to return an object that has a reference to another class object in C++在 C++ 中返回具有对另一个类对象的引用的对象的有效方法
【发布时间】:2019-11-21 15:54:02
【问题描述】:

我试图返回一个对象UnitCubeInstance,它是MeshObject 类的一个实例。 MeshObject 引用了 MeshAsset 类。

我目前的做法很不走运,当对象返回时,MeshAsset 不再可访问。

我的问题是,下面显示的设计是否可行?还是我必须让MeshObject 来保存MeshAsset 的实际实例,这似乎很容易做到,但在内存上效率不高。


有问题的代码:

static MeshObject createUnitCubeInstance(Program &program) {
    auto unitCubeAsset = MeshAsset::UnitCube();
    auto unitCubeInstance = MeshObject(unitCubeAsset);
    return unitCubeInstance;
}

以及这两个类的最小版本:

class MeshAsset {
    // returns a general instance that is designed to be shared, 
    // kind of resemble a singleton
    static MeshAsset UnitCube();
}

class MeshObject {
    MeshAsset& asset;
    MeshObject(MeshAsset& asset);
}

如果我遗漏了对我的示例至关重要的内容,请随时发表评论。

【问题讨论】:

  • 我知道 C++ 没有 ARC 或其他东西,而且一切都倾向于手动操作,但我找不到如何做到这一点。
  • 您向我们展示的MeshObject没有引用任何内容。它根本没有字段!请发布真实代码。你真的将MeshAsset& 引用存储在MeshObject 中吗?这不起作用,因为unitCubeAsset 变量在createUnitCubeInstance 退出后消失。解决方案是:UnitCube() 应该返回一个(智能)指针,或者你应该在 MeshObject 类中进行复制。
  • @freakish 谢谢你的指出!我将MeshAsset& 成员添加到MeshObject 类。我阅读了更多帖子,并意识到unitCubeAsset 将在函数createUnitCubeInstance 退出后结束其生命周期。感谢您指出!我将研究智能指针(以前没有使用过)。
  • 我不愿意将网格资产复制到网格对象。因为每个资产都占用 MB 空间,并且在要渲染的帧中很容易有几十或几百个(我应该指出这是一个计算机图形项目)
  • @jackxujh 这是一个生命周期管理问题。需要有人负责最终清理您创建的unitCubeAsset。现在这发生在createUnitCubeInstance 的末尾,这还为时过早。也许您想要一个拥有所有已创建资产的中心类?然后(只要所述类的寿命比MeshObjects 长)您可以将引用存储在MeshObject

标签: c++


【解决方案1】:

问题是,当你离开作用域时,你存储引用的本地对象被销毁了:

static MeshObject createUnitCubeInstance(Program &program) {
    auto unitCubeAsset = MeshAsset::UnitCube(); // <-- create a local object
    auto unitCubeInstance = MeshObject(unitCubeAsset); // <-- pass a local object as reference
    return unitCubeInstance; // pass object out
} // leave scope and break reference

可能的解决方案:

以防万一:您需要声明 auto&amp; unitCubeAsset = ... 以防您想要存储引用。

【讨论】:

  • 感谢 JIC - 我从来没有意识到 auto 也可以有 auto&amp; 的形式
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多