1. 程式人生 > >c++ 容器中管理存放繼承類物件的智慧指標

c++ 容器中管理存放繼承類物件的智慧指標

需求:

多種繼承類/子類 物件共同存放於容器中, 要求能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