2つの簡単なクラスがあります。基本クラスA
、および派生クラスB
。デバッグの目的で、コピーコンストラクタとデストラクタは次のcout
ものにオーバーライドされます。
class A
{
protected:
char * c;
public:
A(char * c) : c(c) { cout << "+A " << this << "\n"; }
A(const A& other) : c(other.c) { cout << "*A " << this << "\n"; }
~A() { cout << "-A " << this << "\n"; }
};
class B : public A
{
public:
B(char * c) : A(c) { cout << "+B " << this << "\n"; }
B(const B& other) : A(other.c) { cout << "*B " << this << "\n"; }
~B() { cout << "-B " << this << "\n"; }
};
これが私がどのようにinsert
インスタンスにB
入るのかですmap
:
{
cout << "-- 1\n";
map<string, A> m;
cout << "-- 2\n";
m.insert(pair<string, A>( "b", B("bVal")));
cout << "-- 3\n";
}
cout << "-- 4 --\n";
その結果:
-- 1
-- 2
+A 0051F620
+B 0051F620
*A 0051F5EC
*A 00BD8BAC
-A 0051F5EC
-B 0051F620
-A 0051F620
-- 3
-A 00BD8BAC
-- 4 --
インスタンスの作成に関して、私はこれを次のように読みました。
B
私自身のコードによって作成されます- によって
B
コピー構築さA
れますpair
- その最後のインスタンスは、挿入され
A
た場所でもう一度コピーされますmap
ところでpair
、insert
行のをaに変更してpair<string, B>
もうまくいきませんでした。2番目のステップを変更して、のB
代わりにを作成するだけでしたA
が、最後のステップで再度ダウングレードしましたA
。マップ自体が破壊の対象となるまで残るマップ内の唯一のインスタンスは、その最後のA
インスタンスのようです。
何が間違っているのでしょうか。また、派生クラスをマップに取り込むにはどうすればよいですか。フォーマットのマップを使用する
map<string, A*>
多分?
更新-解決策私の解決策は、受け入れられた回答に直接記載されているのではなく、提案の形でコメントに埋もれているため、最終的には次のようになりました。
map<string, shared_ptr<A>> m;
これは、ビルド環境がshared_ptr
sをサポートしていることを前提としています。これは私のもの(C ++ / CLI、Visual Studio 2010)がサポートしています。