基本クラスに初期化ファイナライザを実装したいと思います。最も簡単な方法は、ファイナライズ手順をメソッドに提供することです。残念なことに、最も派生したコンストラクタの終わりに常にそれを呼び出すことを忘れないように強制します。私は理想的な効果を達成するために、基本クラスでRAIIを使用することができると思って、このようなコードを書いた:C++で初期化ファイナライザを実装する方法は?
#include <iostream>
using namespace std;
struct Base
{
Base()
{
struct Finishializer
{
~Finishializer()
{
cout << "Base::~Finishializer" << endl;
}
} finishializer;
cout << "Base::Base()" << endl;
}
~Base()
{
cout << "Base::~Base()" << endl;
}
};
struct Derived : Base
{
Derived()
{
cout << "Derived::Derived()" << endl;
}
~Derived()
{
cout << "Derived::~Derived()" << endl;
}
};
int main()
{
Derived();
}
それから私は、コンストラクタのためのコールスタック評価の逆の順序があり実現しました。 私の "Finishializerパターン"は、まずベースコンストラクタをコールし、ベースコンストラクタの終わりに(次のスタックフレームとして)派生コンストラクタをコールする必要があります。 残念ながら、C++(私の場合はVS2015)は他の方法で動作します。 これは派生コンストラクタを呼び出しますが、最初の命令として(次のスタックフレームとして)ベースコンストラクタを呼び出します。
それは次のような出力につながる:代わりに私の夢を見た1の
Base::Base()
Base::~Finishializer
Derived::Derived()
Derived::~Derived()
Base::~Base()
:
Base::Base()
Derived::Derived()
Base::~Finishializer
Derived::~Derived()
Base::~Base()
がそのままスタックを評価するためにいくつかの良い理由がある、または多分それは私のように変更することができます"finishializers"を実装するように提案?現在のC++実装でこのようなことをするための代替パターンを知っていますか?
何Factoryパターンの使用について? – user463035818
良いスタートはコンストラクタの構造体* out *を移動し、 'finishializer'を標準のメンバ変数にすることです。 –
また、 '' final'デストラクタに "finishializer"コードを置くのは間違っていますか?それはデストラクタの目的です*。あなたはこれのユースケースを詳しく教えていただけますか?この解決策が解決しなければならない問題は何ですか? –