我是OOP / C ++的新手,正在努力应对一个看似简单的问题。 我有一个包含一些数据的类和一个带有一些附加数据的派生类。我希望这些类的对象在容器(特别是map)中,并且能够调用可以接受value_type的函数。 我发布了以下问题(thx for answers),这是第一次尝试,但我担心它过于复杂(例如需要大量的模板化函数,动态转换(请参阅下面的第一个链接答案),帖子说不要将原始指针存储在容器中,等)
Can I pass a reference to a map where the data is a pointer to a derived class?
相关: Inheritance in std::map with base class as value
我正在研究的另一种方法是使用不同的容器包装,如下所示。这感觉非常笨拙 - 例如我真的不想为'insert'这样的方法编写包装器。 该示例显示了一个容器的one_coord value_type和另一个容器的two_coord value_type。 关于如何建模的任何建议都表示赞赏。
#include <map>
// has a single coordinate value
class one_coord {
private:
int coord_a_;
};
// has two coordinate values
class two_coord : public one_coord {
private:
int coord_b_;
};
// a container with one_coord objects
class one_coord_map {
public:
typedef one_coord value_type;
// yuck:
void insert(int k, value_type& v) { m_.insert(std::pair<int, value_type>(k, v) ); }
// etc...
private:
typedef std::map<int, value_type> pair_type;
pair_type m_;
};
// a container with two_coord objects
class two_coord_map {
public:
typedef two_coord value_type;
// insert etc ???
private:
typedef std::map<int, two_coord> pair_type;
pair_type m_;
};
int main() {
one_coord_map one_cm;
two_coord_map two_cm;
one_coord oc;
one_cm.insert(0, oc); // just for example
return 0;
}
最新的coord_map如下所示,但重做插入,擦除等不可能是正确的。
template <typename T>
class coord_map {
public:
typedef T value_type;
void insert(int k, value_type& v) { m_.insert(std::pair<int, value_type>(k, v) ); }
// etc...
private:
typedef std::map<int, value_type> pair_type;
pair_type m_;
};