c++ 容器中管理存放繼承類物件的智慧指標
阿新 • • 發佈:2018-12-11
需求:
多種繼承類/子類 物件共同存放於容器中, 要求能push進不同物件,pop出來後能實現多型。
實現分析:
這種情況就得容器中存放基類指標,但是存放指標就意味著得自己管理記憶體,主動釋放。 有沒有方法讓c++自己去管理呢,答案是用智慧指標。
示例程式碼: 容器中存放的是unique_ptr, pop出來後可以轉成shared_ptr給外界去呼叫。超級方便
#include <stdio.h> #include <stdlib.h> #include <list> #include <memory> #include <iostream> using namespace std; class Base { public: Base(); ~Base(); virtual void Func(); }; Base::Base() { printf( "%s\n", __func__ ); } Base::~Base() { printf( "%s\n", __func__ ); } void Base::Func() { printf( "base::%s\n", __func__ ); } class Drived : public Base { public: Drived(); ~Drived(); virtual void Func(); }; Drived::Drived() { printf( "%s\n", __func__ ); } Drived::~Drived() { printf( "%s\n", __func__ ); } void Drived::Func() { printf( "drived:%s\n", __func__ ); } template<typename T, typename... Ts> std::unique_ptr<T> make_unique(Ts&&... params) { return std::unique_ptr<T>(new T(std::forward<Ts>(params)...)); } std::list<std::unique_ptr<Base> > myList; template<typename T> void Push(const T &base) { myList.push_back(make_unique<T> (std::move(base))); } void Pop() { //std:unique_ptr<Base> ptr = std::move(myList.front()); std::shared_ptr<Base> ptr = std::move(myList.front()); ptr->Func(); myList.pop_front(); } int main( int argc, char **argv ) { Drived drived; Push(drived); Pop(); return 0; }
編譯請加--std=c++11
輸出:
./a.out Base Drived drived:Func ~Base ~Drived ~Base
作者:帥得不敢出門 c++哈哈堂 31843264