Различные виды объектов в массиве и получение типа каждого - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь добавить различные типы объектов в массив, и я хочу получить тип производного класса до приведения.Есть ли хорошее решение?

Кстати: этот пример не работает.Тип не установлен правильно, когда я проверяю объекты.

псевдокод:

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])

** Обновление: **

Я не понимаю, почему это не работает.
Во-первых, тип должен бытьпередан в подкласс и доступен.
Во-вторых, я понимаю, почему первый и последний - 4, но я не понимаю, почему второй тип элементов равен 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 Ответ

0 голосов
/ 04 октября 2018

Как уже отмечалось, вы можете использовать умные указатели, чтобы обеспечить правильное уничтожение и поместить указатель базового класса в вектор.(Обратите внимание, что в моем примере диапазон основан на потребностях как минимум C ++ 11)

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...