2016-02-29 69 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

相關問題