是否有任何制作通用对象矢量或数组的方法,允许我在单个向量或数组中保存不同类的对象。
我基本上想知道是否可以切换出调用哪个版本的类。
即。 class square用class circle替换,但两者都有一个名为findArea的函数,因此在调用该对象向量/数组时,main函数不会中断。
答案 0 :(得分:0)
你需要某种间接。
std::vector<std::unique_ptr<Shape>> array_of_shapes;
所有形状都是由Shape派生的类。
然后,如果Shape有一个virtual findArea()
,那么你总是可以调用array_of_shapes[i]->findArea();
(假设这个地方实际已经填满了)。
答案 1 :(得分:0)
您正在寻找的是多态性。这是C ++和其他面向对象语言的基本特性。
您可以声明一个名为Shape
的基类,并从中继承您的Square
和Round
类。然后,只需在您选择的标准库容器中保存指针(或更好的智能指针)。
struct Shape {
virtual size_t getArea() = 0;
};
struct Round : public Shape {
virtual size_t getArea() { /* return calc */ }
};
struct Square : public Shape {
virtual size_t getArea() { /* return calc */ }
};
main () {
auto round = std::static_pointer_cast<Shape>(std::make_shared<Round>());
auto square = std::static_pointer_cast<Shape>(std::make_shared<Square>());
std::vector<std::shared_ptr<Shape>> vec;
vec.push_back(round);
vec.push_back(square);
for (auto & x : vec)
cout << x->getArea() << endl;
}
关于您的评论:
我基本上想知道是否可以切换出调用哪个版本的类。
您可以使用以下方法之一来实现:
RTTI:使用dynamic_cast<>
检查您所持有的对象是否属于某种类型:
if (dynamic_cast<Round>(x.get()) != NULL)
// x is a Round
else if (dynamic_cast<Square>(x.get()) != NULL)
// x is a Square
将一个成员添加到您的类中,根据类型对其进行初始化,然后只需检查它:
struct Shape {
enum Type {
Round,
Square
}
Type _type;
Type getType() { return _type; }
Shape(Type type) : _type(type) {}
[..]
}
struct Round : public Shape {
Round() : Shape(Shape::Round) {}
[..]
};
// Check it later on using:
switch (x->getType()) {
case Round:
// use
break;
[..]
}
使用typeid()
。只要你的基类是多态的,它就会给你正确的类型信息:
if (typeid(*x) == typeid(Round)) {
// x is a Round
} else if (typeid(*x) == typeid(Square)) {
// x is a Square
}