3

我的应用程序中有一个案例,我需要根据从外部源返回的类型信息动态创建一个新对象。基本上,我有 A 类来处理这个任务。该类将创建类 B、C 或 D 等(例如 B 是基类,C 和 D 是派生类型)。然后我想将此对象传递给一个现有接口,该接口充满了需要 B 类型引用参数的方法。最终,这个动态分配的对象存储在另一个类的 boost::shared_ptr 成员对象中(我使用 reset() shared_ptr 上的方法)。因此,此时内存正在由某人管理。

基本上,这对我来说似乎是一个糟糕的设计(我正在到处传递这个动态分配的对象,在某一点取消引用它,然后稍后再次获取指向它的指针)。另一方面,我不想更改接口的几个方法来获取指针而不是引用。当我将对象传递给接口以进行进一步处理时,我想不理会该接口并取消引用指针。我在某处读到,当您有一个采用引用参数的方法时,您会说“我不关心这里的内存管理”和“这个对象将被初始化 - 即不能为 NULL”。该对象最初是在堆上创建的,最终将由另一个管理其内存的类“拥有”。

4

1 回答 1

1

我认为在对象使用和生命周期方面设计的主要目标应该是对象的所有权在任何时候都是清晰且易于理解的。理想情况下,创建和删除只在一个地方处理,或者当您在其他地方创建和移交时明确标示——同样,这应该只在一个地方完成。

我的偏好是,在该对象完全由某段代码拥有之前,应该使用指针。一旦拥有它,所有者就可以将其作为参考传递。

  • 使用指针,可以解释为“这是一个对象 - 有人想要它吗?”
  • 对于引用,您是在说“这是我的对象 - 您可以使用它”

但是,如果这迫使您使其余的代码变得丑陋和混乱,那么保持这种理想就不值得您付出代价。如果您至少可以使创建和移交看起来干净,那么您可以将古怪的东西隐藏在代码的其他一些(有据可查的)部分中......

B * myInst = A::BFactory( current_state_of_universe );
bool bSubmitted = SubmitForMagic( myInst );
if( !bSubmitted ) delete myInst;
于 2012-08-14T03:26:58.993 回答