暴露复杂短期对象的正确方法

时间:2011-01-04 14:12:39

标签: c++ pointers binding

我正在开发达尔文进化模拟。出于性能原因,它是用C ++编写的。 sim由一个World实例表示。动物由动物实例代表,动物是一个相当复杂的物体。世界有两个重要的方法:

animal_at(int i) 

evolve(int n). 

animal_at返回一个非null的原始指针,指向代表第i个动物的Animal实例 evolve推进模拟可能使animal_at返回的任何指针无效。 我想从外面轻松访问sim和动物。我有特定于python的绑定,但我正在考虑学习CORBA或Ice来实现更通用的接口。问题是我应该如何暴露动物。我有两个想法,其中没有一个让人感到满意: 1)稍微重写代码以使用shared_ptr而不是raw ptr并使用理解shared_ptr语义的中间件。 2)生成一个“深度惰性代理”,其结构与Animal相同。其成员将以递归方式代表Animal的成员。在引用实际数据之前,实际上会在最后一刻调用animal_at - 指针将被使用并立即被抛弃。这将实现“最后时刻”语义。

我不喜欢1)因为我必须引入一个对象的“僵尸”状态,这对我来说看起来不优雅。 我不喜欢2)因为代理的唯一目的是实现“最后时刻”语义。

我正在寻找一种自动的非侵入式方式(使用代码生成)来实现这一点,因为我不想掩盖原始代码的含义。对于我称之为“最后时刻”的语义,是否有任何“官方”名称?

4 个答案:

答案 0 :(得分:2)

可以选择使用boost :: weak_ptr。你可以传递这些,他们必须使用lock()来获取底层的shared_ptr,以便他们可以看到对象是否不再存在。

对象的生命周期仅由持有shared_ptr的位置确定。因此,在对象的生命周期中必须始终至少有一个这样,并且在创建weak_ptr之前需要一个。

答案 1 :(得分:1)

首先,您可以考虑使用xml-rpc而不是CORBA作为中间件(现在标准使用更多)。

其次,外部用户使用编组数据。他们发送了一个关于中间件的编组参考,并期望根据他们的请求和参考编组信息,所以我不知道它如何与“最后时刻”的sementics和指针一起工作。您要么保留所有临时动物,所以外部用户可以查询它们,或者您可能必须为未找到的动物发送很多例外。 (或者你让他们要求“最新的”动物)

答案 2 :(得分:1)

如果你的animal_at函数返回一个可以在将来的任何时候无效的指针,你可能会尝试让它返回一个智能指针(我建议shared_ptr超过{{1}在这里,但如果你对实现小心,你可以逃脱弱指针)。但是,不要直接指向weak_ptr对象,而是指向Animal对象。这样,当您使指针无效时,您可以在指针上设置boost::optional<Animal>标志,并且新失效对象的任何用户都可以检查是否需要获取新指针。

答案 3 :(得分:1)

我不明白为什么你想导出一个指针而不是导出一个看起来恰好是你想要的“最后一刻”语义的接口。您的animal_at可以返回一个对象 id ,而不是指针,并且该接口将提供对该对象的所有必需访问权限,例如dosomething(id, params)。该接口还可以包含锁定/解锁内容以启用原子访问。