代码之家  ›  专栏  ›  技术社区  ›  madmax

数组中不同类型的对象,并获取每个对象的类型

  •  0
  • madmax  · 技术社区  · 7 年前

    顺便说一句:这个例子行不通。检查对象时类型设置不正确。

    伪代码:

    enum Fruit {
      APPLE = 0,
      BANANA = 1
    }
    
    class Fruit {
    public:
       int type;
    }
    
    class Apple : Fruit {
       ...
    }
    
    class Banana : Fruit {
       ...
    }
    
    Apple *apple = new Apple();
    apple->type = APPLE;
    
    vector<Fruit*> fruits;
    fruits.push_back(apple);    
    
    if(fruits[0].type == BANANA)  // type always the same ...
       static_cast<Banana*>(fruits[0])
    

    我不明白为什么这样不行。

    class PolyTest {
    public:
      int type;
    };
    
    class SubA : public PolyTest{
    
    };
    
    class SubB : public PolyTest{
    
    };
    
    std::unique_ptr<SubA> sub = std::make_unique<SubA>();
    sub->type = 66;
    
    std::unique_ptr<SubB> subb = std::make_unique<SubB>();
    sub->type = 3;
    
    std::vector<PolyTest*> tests;
    tests.push_back(sub.get());
    tests.push_back(subb.get());
    sub->type = 4;
    tests.push_back(sub.get());
    
    std::cout << "subtype: " << tests[0]->type << std::endl;
    std::cout << "subtype: " << tests[1]->type << std::endl;
    std::cout << "subtype: " << tests[2]->type << std::endl;
    

    这将返回:

    subtype: 4
    subtype: 0  
    subtype: 4
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Plurax    7 年前

    class Fruit
    {
      public:
        Fruit(int p_type) { type = p_type;};
        int getType() { return type; }
      protected:
        int type;
    };
    
    class Banana : public Fruit
    {
      public:
        Banana() :Fruit(1) {};
    };
    
    class Apple : public Fruit
    {
      public:
        Apple() :Fruit(2)  {};
    };
    
    
    
    int main(int argc, char* argv[]) {
        std::vector<std::shared_ptr<Fruit>> vec;
    
        auto f1 = std::make_shared<Banana>();
        auto f2 = std::make_shared<Apple>();
    
        vec.push_back(f1);
        vec.push_back(f2);
    
        for (auto f : vec)
        {
            std::cout << "my Type is : " << f->getType() << std::endl;
        }
    }