通用对象向量/数组,其中每个存储对象具有不同的类

时间:2017-10-27 13:54:53

标签: c++ arrays class object vector

是否有任何制作通用对象矢量或数组的方法,允许我在单个向量或数组中保存不同类的对象。

我基本上想知道是否可以切换出调用哪个版本的类。

即。 class square用class circle替换,但两者都有一个名为findArea的函数,因此在调用该对象向量/数组时,main函数不会中断。

2 个答案:

答案 0 :(得分:0)

你需要某种间接。

std::vector<std::unique_ptr<Shape>> array_of_shapes;

所有形状都是由Shape派生的类。

然后,如果Shape有一个virtual findArea(),那么你总是可以调用array_of_shapes[i]->findArea();(假设这个地方实际已经填满了)。

答案 1 :(得分:0)

您正在寻找的是多态性。这是C ++和其他面向对象语言的基本特性。

您可以声明一个名为Shape的基类,并从中继承您的SquareRound类。然后,只需在您选择的标准库容器中保存指针(或更好的智能指针)。

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
    }