【发布时间】: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++