5

我有一个类,它在一个公共方法中创建一个对象。该对象是私有的,对类的用户不可见。然后,此方法调用同一类中的其他私有方法,并将创建的对象作为参数传递:

class Foo {
   ...
};

class A {
   private:
      typedef scoped_ptr<Foo> FooPtr;

      void privateMethod1(FooPtr fooObj);

   public:
      void showSomethingOnTheScreen() {
          FooPtr fooObj(new Foo);
          privateMethod1(fooObj);
      };
};

我相信在这种情况下正确的智能指针将是一个 scoped_ptr,但是,我不能这样做,因为如果以这种方式使用 scoped_ptr 会使类不可复制,所以我应该这样制作方法:

void privateMethod1(FooPtr& fooObj);

privateMethod1 不存储对象,也不保留对它的引用。只需从Foo类中检索数据。

正确的方法可能是根本不使用智能指针并在堆栈中分配对象,但这是不可能的,因为它使用的库不允许堆栈上的对象,它们必须在堆上。

毕竟,我仍然对 scoped_ptr 的真正用法感到困惑。

4

5 回答 5

3

另一种可能性是将对象创建为 static_ptr 以便于内存管理,但只需将原始指针传递给其他私有方法:

void privateMethod1(Foo *fooObj);

void showSomethingOnTheScreen() {
  scoped_ptr<Foo> fooObj(new Foo);
  privateMethod1(fooObj.get());
};
于 2009-03-17T18:20:28.563 回答
3

我会在 showSomethingOnTheScreen 中使用 scoped_ptr,但将原始指针(或引用)传递给 privateMethod1,例如

scoped_ptr<Foo> fooObj(new Foo);
privateMethod1(fooObj.get());

于 2009-03-17T18:20:51.977 回答
1

在这里使用简单的 std::auto_ptr 因为你不能在堆栈上创建对象。对于您的私有函数来说,最好只接受原始指针。

真正的用法是您不必捕获所有可能的异常并进行手动删除。

事实上,如果您的对象没有修改对象并且您的 API 返回对象,那么您最好使用

void privateMethod1(const Foo& fooObj);

并将对象作为

privateMethod1(*fooObj.get());
于 2009-03-17T18:16:46.747 回答
1

我对“它使用的库不允许堆栈上的对象,它们必须在堆上”的评论持怀疑态度。

为什么?这通常意味着必须以某种特殊方式释放它们——所以这些解决方案可能都不起作用。

于 2009-03-17T18:18:44.760 回答
0

在这种情况下,您只需更换分配机制。
在堆上创建对象,但将对象作为引用传递给私有方法。

class A {
   private:
      void privateMethod1(Foo& fooObj);

   public:
      void showSomethingOnTheScreen() {
          scoped_ptr<Foo> fooObj(new Foo);
          privateMethod1(*(fooObj.get()));
      };
};
于 2009-03-17T18:29:51.877 回答