【发布时间】:2015-02-03 20:55:18
【问题描述】:
我正在开发一组向量类,它们都派生自一个抽象向量。我这样做是为了在我们使用这些向量的软件中,我们可以在向量之间快速切换而不会破坏任何代码(或者至少将故障最小化,但我的目标是完全兼容)。所有向量都匹配。
我正在研究一个基于磁盘的向量,该向量主要符合 STL 向量实现。我这样做是因为我们需要处理包含各种格式数据的大量内存不足文件。磁盘向量通过使用序列化和反序列化类的模板专业化/多态性来处理对磁盘的数据读/写。数据序列化和反序列化已经过测试,并且可以正常工作(到目前为止)。我的问题是在处理对数据的引用时出现的。
例如,
给定一个 DiskVector dv,调用 dv[10] 将获得磁盘上的一个点,然后在那里寻找,读出字符流。该流被传递给反序列化器,它将字节流转换为适当的数据类型。一旦我得到了价值,我就归还它。
这是我遇到问题的地方。在 STL 中,他们将其作为引用返回,所以为了匹配他们的风格,我需要返回一个引用。我所做的是将值存储在具有给定索引(在本例中为 10)的 unordered_map 中。然后我返回对 unordered_map 中值的引用。
如果这种情况在没有清理的情况下继续下去,那么 DiskVector 的用途就会丢失,因为所有数据都刚刚加载到内存中,这对数据大小来说是很糟糕的。因此,我稍后在进行其他调用时通过删除索引来清理此地图。不幸的是,如果用户决定将这个引用保存很长时间,然后它在 DiskVector 中被删除,我们就有问题了。
所以我的问题
- 有没有办法查看对某个实例的任何其他引用是否正在使用?
- 有没有更好的方法来解决这个问题,同时仍然保持多态样式,原因在开头所述?
- 是否可以构造一个特殊的类来充当引用,但动态处理磁盘 IO,以便我可以直接返回它?
- 还有其他想法吗?
【问题讨论】:
-
您可以返回一个具有
operator T()和operator=(T const &)的对象,而不是返回引用。这意味着您可以将这个对象作为数据的实例来使用。您将使用文件中的偏移量构造此对象,因此operator T()将成为从磁盘读取数据的代理,operator=(T const &)将成为将数据写入磁盘的代理。 -
是的,在the
vector<bool>specialization 中有返回包装对象而不是实际 C++ 引用的先例。 -
太棒了。谢谢你。我会让它工作并发布解决方案的详细信息。
-
另一个问题。我需要哪些函数/运算符定义才能使其与以下操作一起使用?
ref.someFunction()和data_type * p = &ref其中.someFunction()可以修改数据。是operator data_type& ();。我发现了类似的东西HERE -
没有任何东西可以用来使该语法直接工作。例如,如果您执行了
data_type & ref = *(container.front()),则代理对象是一个临时对象,它将在表达式结束时消失,从而导致悬空引用。此外,请注意直接改变数据对象不会影响存储在磁盘上的内容,除非data_type类有一些管道可以将其报告回集合。一种解决方法是让代理对象允许获取const data_type &,然后您必须复制数据,对其进行变异,然后将其分配回代理。
标签: c++ vector reference polymorphism disk-io