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

时间:2016-02-29 12:08:24

标签: c++

我有以下代码的课程

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. 如何清除类Base的myMap
  3. 何时清除类Base的myMap

1 个答案:

答案 0 :(得分: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
  

如何清除类Base的myMap

在Base类中添加一个函数来清除映射:它应该循环遍历所有元素并删除分配的Info对象(如果你也分配它们也会删除键),然后调用mymap.clear()`。

  

何时清除类Base的myMap

完成后使用它。

  

我们可以将成员变量之一的指针传递给其他类对象的函数

是的,只要您可以保证指针有效,而另一个类的函数正在使用它(在您的情况下是这样)。