Suchen Sie den Objekttyp in C++

Faiq Bilal 12 Oktober 2023
  1. Suchen Sie den Typ von Klassenobjekten in C++
  2. Verwenden Sie typeid().name(), um den Typ von Klassenobjekten in C++ zu finden
  3. Verwenden Sie typeid.().name() mit __cxa_demangle, um den Typ von Klassenobjekten in C++ zu finden
Suchen Sie den Objekttyp in C++

Dieser Artikel beschreibt verschiedene Ansätze zum Ermitteln des Objekttyps in C++.

Suchen Sie den Typ von Klassenobjekten in C++

Ähnlich wie einfache Variablen Datentypen wie int, bool usw. haben, haben Klassenobjekte einen Typ, der die Klasse ist, zu der sie gehören:

#include <iostream>

using namespace std;

class Vehicles {
 public:
  string make;
  string model;
  string year;
};

int main() { Vehicles car; }

Im oben gezeigten Beispiel ist der in main() definierte Objekttyp car die Klasse Vehicles, da das car ein Objekt von Vehicles ist.

Das obige Beispiel war sehr einfach und wir konnten den Objekttyp leicht identifizieren. Aber in komplexeren Projekten, insbesondere wenn mehrere Klassen und Objekte und mehrere Programmierer zusammenarbeiten, kann es sehr verwirrend sein, den Überblick über Objekttypen zu behalten.

Um dieses Problem zu vermeiden, können wir einige Methoden verwenden, um den Typ eines Objekts zu bestimmen, und wir werden sie unten mit Beispielen durchgehen.

Verwenden Sie typeid().name(), um den Typ von Klassenobjekten in C++ zu finden

typeid() ist eine Methode, die in der typeinfo-Bibliothek enthalten ist. Die Funktion typeid.().name() übernimmt eine Variable oder ein Klassenobjekt und gibt den Namen ihres Typs als String zurück.

Die Verwendung der Funktion typeid.().name() wird unten gezeigt:

#include <iostream>
#include <typeinfo>

using namespace std;

class Vehicles {
 public:
  string make;
  string model;
  string year;
};

class Aircraft {
 public:
  string make;
  string model;
  string year;
};

int main() {
  int x;
  float y;
  bool b;

  Vehicles car;
  Aircraft helicopter;

  cout << "The type of the variable x "
       << " is " << typeid(x).name() << endl;
  cout << "The type of the variable y "
       << " is " << typeid(y).name() << endl;
  cout << "The type of the variable b "
       << " is " << typeid(b).name() << endl;
  cout << "The type of the object car "
       << " is " << typeid(car).name() << endl;
  cout << "The type of the object helicopter "
       << " is " << typeid(helicopter).name() << endl;
}

Das obige Code-Snippet erzeugt die folgende Ausgabe:

The type of the variable x  is i
The type of the variable y  is f
The type of the variable b  is b
The type of the object car  is 8Vehicles
The type of the object helicopter  is 8Aircraft

Wie oben zu sehen ist, funktioniert die Funktion typeid.().name() sowohl für einfache Variablen als auch für benutzerdefinierte Klassenobjekte. Die Funktion gibt jeweils i, f und b für int, float und bool zurück.

Die Funktion gibt die Namen ihrer jeweiligen Klassen für die Objekte Auto und Helikopter zurück. Es ist wichtig zu beachten, dass Ausgabeklassennamen in diesem Beispiel eine Zahl 8 vorangestellt haben, da Klassen- und Variablennamen im Kontext von C++ gespeichert werden.

Die Funktion typeid.().name() ist system- und compilerabhängig, wenn sie mit Klassenzielen verwendet wird, und kann bei der Rückgabe jedes beliebige Zeichen vor dem Klassennamen anhängen. Im verwendeten System hängt der Compiler die Anzahl der Zeichen des Klassennamens vor den Klassennamen, d.h. sowohl Vehicle als auch Aircraft haben 8 Buchstaben in ihren Namen.

Da typeid.().name() implementierungsabhängig ist, gibt es einen entstellten Klassennamen zurück, der wiederum mit dem c++filt-Befehl oder __cxa_demangle entmannt werden kann.

Obwohl der Klassenname in verstümmelter Form zurückgegeben wird, ist er immer noch lesbar und kann verwendet werden, um die Klasse des Objekts zu identifizieren. Und da der Rückgabetyp ein String ist, können Objekte einfach verglichen werden, um zu prüfen, ob sie dieselbe Klasse haben.

Verwenden Sie typeid.().name() mit __cxa_demangle, um den Typ von Klassenobjekten in C++ zu finden

Wie im vorherigen Beispiel gezeigt, gibt die Verwendung von typeid.().name() verstümmelte Klassennamen und Variablentypen zurück. Um das entstellte Ergebnis zu erhalten, können wir die Funktion __cxa_demangle aus der Bibliothek cxxabi.h verwenden.

Die Syntax für __cxa_demangle lautet wie folgt:

char *abi::__cxa_demangle(const char *mangled_name, char *output_buffer, size_t *length, int *status)

Die Verwendung von __cxa_demangle mit typeid.().name() wird im folgenden Beispiel gezeigt:

#include <cxxabi.h>

#include <iostream>

using namespace std;

class Vehicles {
 public:
  string make;
  string model;
  string year;
};

class Aircraft {
 public:
  string make;
  string model;
  string year;
};

int main() {
  int x;
  float y;
  bool b;

  Vehicles car;
  Aircraft helicopter;

  cout << "The type of the variable x "
       << " is "
       << abi::__cxa_demangle(typeid(x).name(), nullptr, nullptr, nullptr)
       << endl;
  cout << "The type of the variable y "
       << " is "
       << abi::__cxa_demangle(typeid(y).name(), nullptr, nullptr, nullptr)
       << endl;
  cout << "The type of the variable b "
       << " is "
       << abi::__cxa_demangle(typeid(b).name(), nullptr, nullptr, nullptr)
       << endl;
  cout << "The type of the object car "
       << " is "
       << abi::__cxa_demangle(typeid(car).name(), nullptr, nullptr, nullptr)
       << endl;
  cout << "The type of the object helicopter "
       << " is "
       << abi::__cxa_demangle(typeid(helicopter).name(), nullptr, nullptr,
                              nullptr)
       << endl;
}

Im Rahmen dieses Beispiels ging es uns nur um das erste Argument der Funktion __cxa_demangle, also den entstellten Namen. Die restlichen Argumente waren für diesen Fall nicht erforderlich.

Der obige Code erzeugt die folgende Ausgabe:

The type of the variable x  is int
The type of the variable y  is float
The type of the variable b  is bool
The type of the object car  is Vehicles
The type of the object helicopter  is Aircraft

Wie aus der Ausgabe hervorgeht, sind die zurückgegebenen Variablen- und Typnamen entstellt und erscheinen genau so, wie sie in der Codedatei erscheinen.