Помещение производных классов в карты STL в качестве значений

У меня есть 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 --

Что касается создания экземпляров, я прочитал это следующим образом:

  1. Bсоздается моим собственным кодом
  2. что Bполучает копию -, построенную в Aс помощьюpair
  3. этот последний экземпляр Aзатем снова копируется map, куда он вставляется

Кстати, изменение pairв строке insertна pair<string, B>не помогло, он только изменил 2-й шаг, чтобы создать Bвместо A, но последний шаг снова понизьте его до A. Единственный экземпляр на карте, который остается до тех пор, пока сама карта не подлежит уничтожению, кажется, это последний экземпляр A.

Что я делаю неправильно и как я должен получить производный класс на карту? Используйте карты формата

map<string, A*>

возможно?

Обновление -Решение Поскольку мое решение не указано прямо в принятом ответе, а скорее скрыто в его комментариях в виде предложений, вот что я в итоге сделал:

map<string, shared_ptr<A>> m;

Это предполагает, что ваша среда сборки поддерживает shared_ptrs -, что делает мой (C++/CLI, Visual Studio 2010 ).

0
задан Eugene Beresovsky 16 July 2012 в 11:20
поделиться