2012-05-28 53 views
1

我现在有载体,如:shared_ptr的矢量与

vector<MyClass*> MyVector; 

,我访问使用

MyVector[i]->MyClass_Function(); 

我想利用shared_ptr。这是否意味着所有我需要做的就是改变我vector到:

typedef shared_ptr<MyClass*> safe_myclass 

vector<safe_myclass> 

,我可以继续使用我的代码的其余部分,因为它以前?

+12

最好是'shared_ptr ' –

+0

好的,但会shared_ptr 允许我复制矢量而不是矢量?我没有在我的代码中使用任何多态。 – user997112

+4

'shared_ptr '已经是一个指针了,一个指向'MyClass'对象的共享指针。 'shared_ptr '将是一个指向指针的指针,或者是'MyClass **'的原始等价物。 –

回答

9

可能只是std::vector<MyClass>。你

  1. 多态类或
  2. 不起拷贝构造函数或有不能复制一个原因,是确保这一步没有得到由编译器写出来工作?

如果是这样,然后共享指针是要走的路,但通常人们使用这种范例时,它根本不利于他们。

如果要更改为std::vector<MyClass>,那么如果代码稍后变为多态,可能会有一些难以维护的操作,但理想情况下,您需要的所有更改都是更改typedef。

沿着这一点,它可能是有道理的包装你的整个 std :: vector。

class MyClassCollection { 
    private : std::vector<MyClass> collection; 
    public : MyClass& at(int idx); 
    //... 
}; 

因此,您不仅可以安全地换出共享指针,而且还可以换出整个向量。对于期望向量的API,权衡更难以输入,但是那些设计不合适,因为它们应该使用可以为您的类提供的迭代器。

可能这对于您的应用程序来说工作太多(尽管如果将要在面向客户端的库中公开它将是明智的),但这些都是有效的考虑因素。

+0

我使用了矢量,因为我创建了一个递归链接元素链,即使我清空了矢量,我仍然需要它们指向彼此。再加上我希望自动记忆回收的事实。 – user997112

+0

作为一个容器比链接更容易链接列表呢? – djechlin

+0

看起来像你有一些错别字,并使用C#语法:'private'和'public'后面应该跟着“:”。 – 2012-05-28 22:32:01

9

vector<shared_ptr<MyClass>> MyVector;应该没问题。

但如果MyClass的实例没有矢量之外的共享,并使用现代C++编译器11,vector<unique_ptr<MyClass>>shared_ptr更有效(因为unique_ptr不具有shared_ptr的引用计数开销)。

+4

@Deqing不再在C++ 11 – nurettin

+0

@nurettin ..它已不再是“一些”C + 11编译器。 – AJed

+2

@AJed他们有哪些不确定的C++编译器? – nurettin

1

不要立即跳转到共享指针。如果您需要避免复制对象,则可能更适合使用简单的pointer container