Можно ли как-то в c++ узнать принадлежность объекта классу? У меня есть (пока нет но, прежде чем начать нужно определится с такими вещами) массив объектов игры. Это разные классы, которые наследуют от одного (Object, например). То есть все они являются Object. Но как мне понимать, что элемент этого массива является не только Object в общем, но и, например, игроком или врагом или стеной или еще чем-то? В js я бы написал: if (objects[i] instanceof Wall) { ... } Но как такое сделать с С++? При этом без костылей. Или может быть я не правильно понимаю как такие вещи делаются в С++? Если да, но как это организовывают?
В C++ можно использовать оператор dynamic_cast для проверки принадлежности объекта определенному классу. Например, если у вас есть массив указателей на объекты класса Object, и вам нужно проверить, является ли объект игроком, вы можете сделать следующее:
#include <iostream> class Object { public: virtual ~Object() {} }; class Player : public Object { }; int main() { Object* objects[3]; objects[0] = new Object(); objects[1] = new Player(); objects[2] = new Object(); for (int i = 0; i < 3; i++) { Player* player = dynamic_cast<Player*>(objects[i]); if (player) { std::cout << "Object " << i << " is a Player." << std::endl; } else { std::cout << "Object " << i << " is not a Player." << std::endl; } } for (int i = 0; i < 3; i++) { delete objects[i]; } return 0; }
Этот код использует оператор dynamic_cast для попытки преобразования объекта к типу Player. Если объект является игроком, результат будет указателем на объект класса Player, который можно проверить на ненулевое значение. Если объект не является игроком, результат будет nullptr.
Учтите, что при использовании dynamic_cast ваш базовый класс (Object) должен иметь хотя бы один виртуальный метод, иначе dynamic_cast не будет работать.
В C++ можно использовать оператор dynamic_cast для проверки принадлежности объекта определенному классу. Например, если у вас есть массив указателей на объекты класса Object, и вам нужно проверить, является ли объект игроком, вы можете сделать следующее:
#include <iostream>class Object {
public:
virtual ~Object() {}
};
class Player : public Object {
};
int main() {
Object* objects[3];
objects[0] = new Object();
objects[1] = new Player();
objects[2] = new Object();
for (int i = 0; i < 3; i++) {
Player* player = dynamic_cast<Player*>(objects[i]);
if (player) {
std::cout << "Object " << i << " is a Player." << std::endl;
} else {
std::cout << "Object " << i << " is not a Player." << std::endl;
}
}
for (int i = 0; i < 3; i++) {
delete objects[i];
}
return 0;
}
Этот код использует оператор dynamic_cast для попытки преобразования объекта к типу Player. Если объект является игроком, результат будет указателем на объект класса Player, который можно проверить на ненулевое значение. Если объект не является игроком, результат будет nullptr.
Учтите, что при использовании dynamic_cast ваш базовый класс (Object) должен иметь хотя бы один виртуальный метод, иначе dynamic_cast не будет работать.