【发布时间】:2014-03-25 06:45:57
【问题描述】:
问题
我有一个抽象接口Series 和一个具体类Primary_Series,它通过存储大量std::vector<> 值来满足接口。
我还有另一个具体的类Derived_Series,它本质上是Primary_Series 的变换(例如一些大的Primary_Series 乘以3),我想节省空间,所以我不想存储作为成员的整个派生系列。
template<typename T>
struct Series
{
virtual std::vector<T> const& ref() const = 0;
};
template<typename T>
class Primary_Series : Series<T>
{
std::vector<T> m_data;
public:
virtual std::vector<T> const& ref() const override { return m_data; }
}
template<typename T>
class Derived_Series : Series<T>
{
// how to implement ref() ?
}
问题
我应该如何改变这个接口/纯虚拟方法?
我不想按值返回该向量,因为它会为Primary_Series 引入不必要的复制,但在Derived_Series 的情况下,我肯定需要创建某种临时向量。但是后来我面临的问题是,一旦调用者完成了该向量,如何使该向量消失。
如果ref() 会返回一个临时引用,该引用会随着引用的消失而消失,那就太好了。
这是否意味着我应该使用某种std::weak_ptr<>?这是否符合Primary_Series 的工作方式?
什么是满足“最小化内存使用”和“最小化复制”要求的最佳方法,包括在调用者完成后使 Derived_Series 临时消失?
【问题讨论】:
-
derived_series是否意味着某种对primary_series的惰性转换?如果是这样,您是否想让程序员负责保持引用不悬空?如果是这样,我建议参考或 ptr。但是我会推荐在derived_series和primary_series中的shared_ptr,它指向数据。然后你需要解决转换数据的问题......所以我认为你不能正确(即有效和懒惰地)实现给定的接口。您是否有理由要使用此接口而不是实现... -
下标
[]运算符、at()函数或序列上的迭代器? -
@Xarn 是的,懒惰的转换正是我想要的,但是有没有办法让
derived_series在调用者完成后消失?我刚刚看到您的第二条评论 - 这可能会更好,因为它更好地隐藏了实现,并将清理的责任完全转移给了调用者。如果您将其发布为答案,我想我可以接受它作为答案。 -
好吧,我会用少一点“漫无边际”的风格来写它,并且会详细说明一点......
-
@Xarn 我刚刚意识到使用下标运算符或使用 at(),在
Primary_Series的情况下,我最终会制作一个完整的副本,所以我实际上回到了 return-by -value,除非我没有正确理解您的意思。
标签: c++ memory c++11 interface ownership