2016-02-29 2 views
0

У меня есть следующий код классаПередача указателя члена класса (Map) в качестве аргумента по умолчанию к другому методу класса

class Info { 
    public: 
     inline void append(int i) { var1.push_back(i); } 
    private: 
     std::list<int> var1; 
}; 

class Key { 
    public: 
     int getId() {return id}; 
    private: 
     int id; 
}; 

class Base { 
    public: 
     void& getMap() { return myMap;} 
    protected: 
     map<Key*,Info*> myMap; 
}; 


class B { 
    public: 
     void check(bool val,map<Key*,Info*>* = NULL) { 
      // while processing I get key* as key1 
      Key* key1; 
      Info* info = new Info; 
      info->append(1000); 
      myMap.insert(std::pair<Key*,Info*>(key1,info)); 
     } 
}; 

class Derived : public Base { 
    public: 
     void func() { 
      // since Derived is subclass of Class Base so we access the myMap 
      bobject.check(true,&myMap); 
     } 
    private: 
     B bobject; 
}; 

class Client { 
    private: 
     Base b_report; 
    public: 
    void client_func() { 
     map<Key*,Info*> myMapClient = b_report->getMap(); 
     // will be using myMapClient; 
    } 
}; 

Три вопроса

  1. есть какие-либо проблемы в этом коде. мы можем передать указатель одной переменной-члена в зависимости от объекта другого класса
  2. Как очистить MyMap класса Base
  3. когда очистить MyMap класса Base
+1

Отформатируйте сообщение должным образом, прежде чем нажать Submit. –

+3

Один вопрос за вопрос пожалуйста. –

+0

Почему вы храните указатели на карте? Если объекты arent должны принадлежать чему-то другому, просто сохраните объекты на карте, тогда вам не придется беспокоиться о том, чтобы очистить. – user463035818

ответ

0
map<Key*,Info*> myMapClient = b_report->getMap(); 

Вы делаете копию карты.

Оно должно быть:

 map<Key*,Info*>& myMapClient = b_report->getMap(); 

или

 auto& myMapClient = b_report->getMap(); 

или

 //decltype(auto) will infer the & as well 
    decltype(auto) myMapClient = b_report->getMap(); 

также:

void check(bool val,map<Key*,Info*>* = NULL) { 
     // while processing I get key* as key1 
     Key* key1; 
     Info* info = new Info; 
     info->append(1000); 

     // key1 should be set to a valid value... 
     // right now it has a garbage value, could be anything. 
     // perhaps your map should be myMap<int, Info*> instead 
     myMap.insert(std::pair<Key*,Info*>(key1,info)); 
    } 

Вы должны добавить имя второго параметра myMap

void check(bool val,map<Key*,Info*>*myMap = NULL) // perhaps change NULL to nullptr (C++11) 
{ 
    myMap->insert(std::pair<Key*,Info*>(key1,info)); 

} 

или

void check(bool val,map<Key*,Info*>& myMap) 
{ 
    myMap.insert(std::pair<Key*,Info*>(key1,info)); 
} 

Возможно рассмотреть вопрос об использовании std::make_pair вместо этого?

myMap.insert(std::make_pair(key1, info)); // Simpler 

Как очистить MyMap класса Base

Добавить функцию в базовом классе, чтобы очистить карту: он должен петля корыта все элементы и удалить выделенные объекты Info (и если вы их также выделили), а затем вызовите mymap.clear() `.

когда очистить MyMap класса Base

Когда вы закончите его использования.

мы можем передать указатель одной переменной-члена в зависимости от объекта другого класса

Да, до тех пор, как вы можете гарантия, что указатель является действительным в то время как функция от другого класса использует его (в вашем случае это).

+0

Если указатели на карте были динамически распределены, вы определенно не хотите называть 'clear()'. Вы пропустите всю память. – NathanOliver

+0

map :: emplace() лучше, чем вызов insert() с make_pair(): [http://stackoverflow.com/a/17174245/3857](http://stackoverflow.com/a/17174245/3857) – Andy

+0

Проблема связана с map :: emplace(). В принципе, emplace нужно построить объект, прежде чем проверять, существует ли ключ на карте, если он не существует, все хорошо. Однако, если ключ существует уже, тогда он уничтожит объект (так что временный объект был создан ни для чего). Поэтому я бы сказал «нет», это не всегда лучше. Если вы не можете гарантировать, что ключ не существует. Тогда да, должно быть. Но просто сказать emplace лучше не правильный ответ. Где-то в видео youtube.com/watch?v=smqT9Io_bKo Скотт Майерс объясняет это. – Jts

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