将类成员 (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
  3. 何时清除类基的 myMap
 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

在基类中添加一个函数来清除 map:它应该遍历所有元素并删除分配的 Info 对象(以及键,如果您也分配了它们),然后调用 mymap.clear()'。

何时清除类基的 myMap

当你用完它时。

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

是的

,只要你能保证指针是有效的,而另一个类的函数正在使用它(在你的例子中是

)。

最新更新