2016-02-29 70 views
0

的指针我传递类成员(图)作为默认参数的另一个类方法

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
  3. 时明确的阶级基础的
+1

请在提交之前适当地格式化您的帖子。 –

+3

请问每个问题一个问题。 –

+0

为什么你在地图中存储指针?如果对象不应该被其他东西所拥有,只需将对象存储在地图中,那么您不必担心清理。 – user463035818

回答

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

你正在一个的MYMAP地图的副本。

它应该是:

 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添加功能在你的基类,以清除地图:应该循环槽的所有元素,并删除分配的信息对象(键如果你分配它们),然后调用mymap.clear()`。

时明确的阶级基础

的MYMAP当您使用它来完成。

我们可以通过成员变量的一个指针到其他类对象的功能

是的,只要你能保证指针,而从其他类的功能是使用它是有效的(就你而言)。

+0

如果地图中的指针是动态分配的,那么你肯定不想调用clear()。你会泄漏所有的内存。 – NathanOliver

+0

map :: emplace()优于使用make_pair()调用insert():[http://stackoverflow.com/a/17174245/3857](http://stackoverflow.com/a/17174245/3857) – Andy

+0

这是一个map :: emplace()的问题。基本上,emplace需要在检查密钥是否已经存在于地图之前构造对象,如果它不存在,一切都很好。但是,如果密钥已经存在,那么它将销毁该对象(所以临时对象被创建为空)。所以我会说不,总是不会更好..除非你能保证钥匙不存在。那么是的,它应该是。但只是说安心更好不是正确的答案。视频中的某处youtube.com/watch?v=smqT9Io_bKo Scott Meyers解释它。 – Jts

相关问题