2013-02-08 2 views
0

У меня есть два независимых иерархии классов, начиная с BaseClass1, BaseClass2производных классов на картах

это то, что я хочу сделать:

struct BaseClass1 { 
    virtual void obtain_map(std::map<int,BaseClass2> &map) = 0; 
} 

подклассов BaseClass1 переопределения obtain_map. Но проблема в том, что эти подклассы должны иметь возможность использовать подклассы BaseClass2 в параметре map. (Итак, в этом смысле подклассы двух «независимых» иерархий на самом деле связаны, или, скорее, могут быть, если хотят разработчики подкласса)

Как это сделать, или я вынужден создать собственный класс map с нуля ?

ответ

1

Если вы черпаете свои классы, как это и использовать указатель в качестве второго map параметра шаблона (смарт-указатель, как std::unique_ptr сэкономит вам некоторые проблемы управления памятью):

struct BaseClass1 { 
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) = 0; 
}; 
struct DerivedClass1 : public BaseClass1 { 
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) override 
    { 
    } 
}; 

Вы все еще можете пройти в maps с производными версии BaseClass2 как второго типа:

struct DerivedClass2 : public BaseClass2; 
// ... 

std::map<int, std::unique<DerivedClass2>> mdc2; 
DerivedClass1 dc1; 
dc1.obtain_map(mdc2); 
+0

Но кто несет ответственность за освобождение указателя? Это проблема с этими случайными «хаками», не так ли ... :(или это какой-то известный шаблон дизайна в мире C++? – user2015453

+0

@ user2015453 Это не случайный взлом. 'Std :: unique_ptr' управляет освобождение памяти, когда оно выходит за рамки. – Foggzie

0

Контейнеры STL хранят только объекты фиксированного размера. Если yo вытащить объект класса BaseClass2, основанный на std::map<int,BaseClass2>, объекты будут нарезаны на тип BaseClass2.

Если вы хотите std::map для хранения подклассов BaseClass2, вам нужно сохранить указатель (умный указатель) на карте.

Например:

struct BaseClass1 { 
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) = 0; 
    } 

    struct DerivedClass1 : public BaseClass1 { 
    virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) 
    { 
     // implementation 
    } 
} 

Хранение smpart указателей имеет успехи по сравнению с сырым poiter, потому что вам не нужно вручную удалять воспоминания указатели, указывающие на.

Смежные вопросы