)。
我有以下代码
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;
}
};
三个问题
- 这段代码有问题吗? 我们可以将成员变量之一的指针传递给其他类对象的函数吗
- 如何清除类基的 myMap
- 何时清除类基的 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
当你用完它时。
是的我们可以将成员变量之一的指针传递给其他类对象的函数吗
,只要你能保证指针是有效的,而另一个类的函数正在使用它(在你的例子中是