Узнайте дочерний тип элемента вектора родительского типа - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть абстрактный родительский класс с именем «Форма» и некоторые дочерние классы, например, «Круг» и «Звезда».Если я сохраню несколько экземпляров этих дочерних классов в векторе родительского типа, могу ли я узнать дочерний тип одного элемента?

// Классы

class Form {

public:
Form();
virtual ~Form() = default;
virtual  void Draw(CDC* pDC)abstract;

};

class Circle :public Form {
public:
Circle();
~Circle();

void Draw(CDC* pDC) override;
CPoint GetUpperLeft();
CPoint GetLowerRight();


private:
CPoint m_upperLeft;
CPoint m_lowerRight;
};

// Main

int main(){
std::vector<Form> m_forms;
m_forms.pushback(Circle());
m_forms.at(0);//??

}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Как только что @john предложил, вы можете использовать typeid()

Какой-то собранный мной код, который доказывает, что принцип ...

#include <iostream>
#include <typeinfo>

struct Base
{
    virtual ~Base() {}
};

struct Derived : public Base
{
    virtual ~Derived() {}
};

struct Circle : public Base
{
    virtual ~Circle() {}
};


int main()
{
    Derived d;
    Circle c;
    Base *b1 = &d; 
    Base *b2 = &c;

    std::cout << typeid(*b1).name() << std::endl;
    std::cout << typeid(*b2).name() << std::endl;


}
0 голосов
/ 21 февраля 2019

Возможно, не идеальный способ, а простой, добавив функцию к родителю, которая возвращает true в родительском элементе и переопределяет его в дочернем элементе, чтобы он возвращал false

class Form { 
public:
Form();
virtual ~Form() = default;
virtual  void Draw(CDC* pDC)abstract;
virtual bool isParent(){ return 1;}

};

class Circle :public Form {
public:
Circle();
~Circle();

void Draw(CDC* pDC) override;
CPoint GetUpperLeft();
CPoint GetLowerRight();
 bool isParent(){ return 0;}

private:
CPoint m_upperLeft;
CPoint m_lowerRight;
};

Во-вторых, обратите внимание, что если высобираясь создавать элементы при нажатии на вектор, вы должны использовать:

m_forms.emplace_back(new Circle());

, чтобы не делать лишних копий

В дополнение к этому, способ объявления вектора объектов

vector<Form> m_forms;
stores values, not references. 

vector<Form*> m_forms
Or, better yet:

vector< std::shared_ptr<Form> > m_forms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...