#include <iostream>
#include <memory>
#include <vector>
template<class Item>
class BaseTemplate
{
protected:
// no need to make these public
typedef std::shared_ptr<Item> ItemPtr;
typedef std::vector<ItemPtr> Items;
public:
BaseTemplate() {}
virtual ~BaseTemplate() = 0;
virtual void Process() = 0;
// it's better to avoid giving the user access to the shared_ptr objects
// this way you are the *only* owner
const Item & getItem(std::size_t index) const { return *mItems[index]; }
protected:
void addItem(const ItemPtr & inItem)
{
mItems.push_back(inItem);
}
private:
// only base class needs to be noncopyable
BaseTemplate(const BaseTemplate&) = delete;
BaseTemplate& operator=(const BaseTemplate&) = delete;
Items mItems; // data members should be private, not protected
};
template<typename Item>
BaseTemplate<Item>::~BaseTemplate()
{
}
class DerClassA: public BaseTemplate<int>
{
public:
// you don't need to write empty constructor
// empty virtual destructor is required you want to allow inheritance from this class
virtual ~DerClassA() {}
virtual void Process() {
std::cout << "HELLO I AM: DerClassA" << std::endl;
addItem(std::make_shared<int>(3)); //This will push_back objects to m_pContainer
}
};
int main()
{
DerClassA a;
a.Process();
}