Я получил функцию, которая имеет два указателя базового класса и в зависимости от подкласса, другие функции должны быть вызваны …
Как это:
void function(A* a, A* a2){
if (typeid(*a).name() == "B"){
if(typeid(*a2).name() == "C"){
otherFunction();
}
if(typeid(*a2).name() == "D"){
otherFunction2();
}
}
}
Однако есть целая куча проблем:
1) Я прочитал, что typeid.name дает разные результаты в зависимости от компилятора, и поэтому я не хочу его использовать.
2) Я подумал о создании экземпляра «B» и вместо этого писать if(typeid(*a2) == typeid(instanceOfB))
но это было бы много работы, так как есть много аргументов конструктора …
3) Я также рассмотрел использование dynamic_cast, но некоторые подклассы выглядят так:
A <-- B <-- C
поэтому, если бы я хотел проверить, является ли аргумент B динамическим приведением, он прошел бы, даже если аргумент фактически является C, потому что C наследуется от B
Изменить: Кажется, мне придется пересмотреть дизайн, но так как многие заявили, что дизайн имеет недостатки, я быстро объясню, что мой ход мысли:
Там есть окно. Несколько разных объектов расположены внутри окна и перемещаются, игра. Эта функция должна была выполнять функцию обнаружения столкновений. Как это:
Просмотрите все объекты на экране, проверьте, не столкнулись ли они. Возьмите два столкнувшихся объекта в качестве аргумента и вызовите эту функцию.
Эта функция просматривает различные коллизии, такие как «если a -« стрелка », а a2 -« бандит », тогда делайте что-нибудь, но если вместо a2 -« дерево », сделайте это вместо этого!
Не было бы лучше иметь некоторые виртуальные методы в A
которые по умолчанию ничего не делают и перезаписываются некоторыми наследующими классами?
class A {
public:
virtual void method(A *a2) {
}
virtual void otherMethod() {
}
};
class B : public A {
public:
virtual void method(A *a2) {
a2->otherMethod();
}
};
class C : public B {
public:
virtual void otherMethod() {
// do your C stuff here
}
};
class D : public A {
public:
virtual void otherMethod() {
// do your D stuff here
}
};
Достигнет ли это того, что вы пытаетесь сделать?
Других решений пока нет …