scz*_*ztt 1 c++ design-patterns reference ownership
假设我有:
class Metadata {
// stores expensive-to-copy data, provides complex interface to access/modify
}
class SomeObject
public:
Metadata& GetMetadata() { return mMetadata; }
private:
Metadata mMetadata;
}
boost::shared_ptr<SomeObject> obj = ...;
obj->GetMetadata().SetTitle("foo");
obj->GetMetadata().GetTitle();
Run Code Online (Sandbox Code Playgroud)
普遍的共识似乎是,通过引用返回,尤其是非常数,在除了少数特定情况之外的所有情况下都非常糟糕.但是,在这种情况下,它似乎是最好的(也是唯一的?)选项:
它引入了一个模糊的要求,即SomeObject能够通过引用传回元数据,这意味着必须有一个Metadata对象,其生命周期与SomeObject的生命周期相同(或者更长) - 但是,这是对象之间的确切语义关系,并要求肯定比上述任何选项更好.
在我看来,我可以引入某种不可复制的指针类型并返回它,但那闻起来很有趣/似乎有点矫枉过正.我可以让SomeObject拥有一个boost :: shared_ptr,但这真的不是我想到的语义的一个很好的匹配(基本上:如果你现在修改,修改原始 - 如果你以后读/存储,制作副本并自己跟踪).
这里有更好的模式吗?我会以某种方式在脚下射击自己吗?
返回一个比函数调用更长的东西的引用是完全没问题的.当您向类数据成员返回左值引用时,只需确保类实例本身是左值:
struct Foo
{
X data;
X & the_data() & { return data; }
// ^^^
Run Code Online (Sandbox Code Playgroud)
当您使用它时,如果您的实例是右值,您还可以将数据作为右值返回:
X && the_data() && { return std::move(data); }
};
Run Code Online (Sandbox Code Playgroud)