C ++ указывает на объект - PullRequest
0 голосов
/ 17 мая 2018

Как я могу проверить, указывает ли элемент из массива указателей на другой класс на объект из другого класса?

class A  {

    //some code hier

    };

    class B : A {

    B ob;

    };

    class C: B, A {

    A* array[100];

    void check() {

    if (ob* array[100])  {    // ???
    //do something

      }

    }
};

1 Ответ

0 голосов
/ 17 мая 2018

Если класс является полиморфным (то есть содержит хотя бы одну виртуальную функцию), то вы можете проверить, указывает ли указатель на базу конкретного экземпляра производного класса, используя динамическое приведение. Пример:

struct X {
    virtual ~X() = default;
};
struct Y : X {};
struct Z : X {};



int main() {
    Y y;
    X* x = &y;
    if (Y* y = dynamic_cast<Y*>(x))
        ; // x indeed does point to (a base of) Y instance
          // and y now points to that Y instance
    if (Z* z = dynamic_cast<Z*>(x))
        ; // this is never reached, since x doesn't point to a base of Z
}

Не имеет значения, является ли указатель элементом массива.

В противном случае (т. Е. Если класс не является полиморфным), указатель на базу одного класса неотличим от указателя на базу (того же типа) другого класса, и, таким образом, в этом случае такая проверка невозможна в генеральный. Вы можете реализовать это, сохранив информацию о типе производного типа в элементе базы, но это может быть сложным и, вероятно, бесполезным.


PS.

class B : A {

B ob;

};

Класс не может иметь себя в качестве члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...