ストレージ管理承継スマートポインタクラスのオブジェクトのためのC ++のコンテナ

著作権:同意なしにオリジナルの記事は、転載を禁止しhttps://blog.csdn.net/zmlovelx/article/details/82799559

要件:

容器内に一緒に格納された多重継承クラス/サブクラスオブジェクトは、要求を達成することができる多型から飛び出す、異なるオブジェクトにプッシュすることができます。

分析を実現します:

この状況は、コンテナの基本クラスのポインタに格納する必要がありますが、ポインタ記憶手段は、独自のメモリ管理、アクティブリリースを持っています。自分がそれを管理するために、C ++ようにする方法がありますが、答えはスマートポインタを使用することです。

サンプルコード:容器に保存されているが外へ飛び出しを呼び出すためのshared_ptrに変換することができ、unique_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                  
ベース
Drivedは
drived:のFunc
〜ベース
〜Drived
〜ベース

著者:ハンサムなハハ出かけるには余りにも恐れて会場31843264 C ++

おすすめ

転載: blog.csdn.net/zmlovelx/article/details/82799559