2011-08-28 145 views
0

我有一个容器类(即容器)持有shared_ptr初始化不同的 类的基类。我已经实现了这个想法,如下面的代码。将shared_ptr参数添加到容器的有效方法?

问题1>总体而言,你可以找到下面的代码的任何潜在的问题? 我对最佳做法感兴趣,并且当前通过vs2010和 的代码已输出预期结果。

问题2>难道我设计集装箱::添加签名,以便 客户需要在一个shared_ptr通过正确的方式?

#include <iostream> 
#include <vector> 
#include <memory> 

using namespace std; 

class Base 
{ 
public: 
    virtual void PrintMe(void) = 0; 
    virtual ~Base() = 0 {} // **Updated based on comments from [bdonlan]** 
}; 

class SubClassA : public Base 
{ 
public: 
    virtual void PrintMe(void) 
    { cout << "This is SubClassA" << endl; } 
}; 

class SubClassB : public Base 
{ 
public: 
    virtual void PrintMe(void) 
    { cout << "This is SubClassB" << endl; } 
}; 

typedef std::shared_ptr<Base> BasePtr; 
typedef std::vector<BasePtr>::iterator VecIter; 

class Container 
{ 
public: 
    void Add(BasePtr ptr) 
    { vec.push_back(ptr); } 

    void PrintAll() 
    { 
     for (VecIter iter = vec.begin() ; iter < vec.end(); ++iter) 
     { (*iter)->PrintMe(); }  
    } 

private: 
    vector<BasePtr> vec; 
};  

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Container con;  
    BasePtr ptrA(new SubClassA); 
    BasePtr ptrB(new SubClassB);  
    con.Add(ptrA); 
    con.Add(ptrB);  
    con.PrintAll();  
    return 0; 
} 
+0

可能更好地放在CodeReview上? –

+0

那是哪里?你能告诉我这个位置吗? – q0987

+0

你可以在这里找到它:http://codereview.stackexchange.com/questions :) –

回答

1

你需要添加一个虚拟析构函数到Base; BasePtr共享指针将尝试删除子类作为Base *,但这只有在Base具有虚拟~Base时才合法。只需要将virtual ~Base() { }添加到Base课程正文中即可。

除此之外,我真的没有看到任何重大问题。

+0

好的建议,我根据你的建议更新了代码。 – q0987

+0

@ q0987,不是纯粹的虚拟析构函数 - 只是一个普通的虚拟析构函数。所以没有'= 0'的析构函数。 – bdonlan

+0

@ bdonlan,为什么不呢?一个纯粹的虚拟析构函数对抽象类很有好处。虽然这里已经包含了一个纯虚函数'PrintMe'。根据我的理解,“纯虚析构”或“虚构析构” – q0987