In C++ Sie virtuelle Methoden verwenden können folgende Code Arbeit haben, wie Sie erwarten:C++ type casting Alternative zu virtuellen Methoden
#include <iostream>
#include <string>
class BaseClass {
public:
virtual std::string class_name() const { return "Base Class"; }
};
class FirstClass : public BaseClass {
int value = 1;
public:
std::string class_name() const { return "FirstClass"; }
};
class SecondClass : public BaseClass {
long long value = -1;
public:
std::string class_name() const { return "SecondClass"; }
};
int main() {
const int array_size = 5;
const bool in_first_mode = true;
void *data;
int sample_size;
if (in_first_mode) {
data = new FirstClass[array_size];
sample_size = sizeof(FirstClass);
} else {
data = new SecondClass[array_size];
sample_size = sizeof(SecondClass);
}
// this is class-independent code
for (int index = 0; index < array_size; ++index) {
BaseClass *pointer = static_cast<BaseClass*>(data + index * sample_size);
std::cout << pointer->class_name() << std::endl;
}
return 0;
}
Dies sowohl für richtig in_first_mode = true
und in_first_mode = false
arbeiten. Also, im Grunde, wenn Sie Code schreiben wollen, der für beide Klassen funktioniert, können Sie einfach den Zeiger auf die BaseClass verwenden.
Aber was ist, wenn Sie bereits einen Datenpuffer angegeben haben, gefüllt mit Daten vom Typ TypeOne, TypeTwo, TypeThree oder TypeFour, und in Laufzeit kennen Sie diesen Typ, der in int type
gespeichert ist. Problem ist, dass TypeOne, TypeTwo, TypeThree und TypeFour nicht von einer Basisklasse geerbt wurden. In meinem Fall sind das tatsächlich Strukturen aus der 3rd-Party-Bibliothek, die bereits eine kompilierte C-kompatible Bibliothek ist, so dass ich sie nicht modifizieren kann. Ich möchte etwas wie pointer
aus dem obigen Beispiel bekommen, aber das Problem tritt auf, wenn man identifiziert, welcher C++ Typ diese pointer
haben soll.
Es gibt eine elegantere Art Guss Alternative C++ Klassen-Wrapper für diese vier Typen zu machen (was oben etwas ähnlich dem Beispiel gibt) und pointer
zu machen void *
und Notwendigkeit
if (type == 1) {
TypeOne *type_one_pointer = static_cast<TypeOne*>(pointer);
// do something
} else if (type == 2) {
/* ... */
}
sein jeder Zeit verwende ich pointer
?
Sie haben verschiedene Methoden? Wenn nein - Sie können Vorlagen verwenden. Wenn ja - Sie sollten mit ihnen wie mit verschiedenen Klassen arbeiten. – ForEveR
Speichern Sie Funktionszeiger in einem Array und verwenden Sie "type" als Index. – knivil
@ForEveR, wie kann ich Vorlagen dafür verwenden? – Dmitry