Deklaration von Varianten

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Varianten - Index

Die allgemeine Deklarationssyntax für Varianten (Unions) stimmt fast vollständig mit der für Strukturen überein. Es gibt jedoch folgende Unterschiede:

  • Varianten können Bitfelder enthalten, aber nur jeweils eines der Bitfelder kann aktiv sein. Alle diese Bitfelder beginnen am Anfang der Variante. (Beachten Sie, dass Bitfelder maschinenabhängig sind und es dadurch beim Schreiben von portierbarem Programm-Quelltext zu Problemen kommen kann.)
  • Anders als C++-Strukturen können C++-Varianten nicht die Klassenzugriffs-Bezeichner public, private und protected verwenden. Alle Felder einer Variante sind öffentlich.
  • Varianten können nur über ihr erstes deklariertes Element initialisiert werden:
union local87 {
   int i;
   double d;
   } a = { 20 };

Eine Variante kann kein Bestandteil einer Klassenhierarchie sein. Sie kann weder eine Basisklasse sein noch von einer anderen Klasse abgeleitet werden. Eine Variante kann aber einen Konstruktor haben.

Uneingeschränkte Varianten

Ab C++11 sind einige der oben genannten Einschränkungen nicht mehr gültig.

Varianten (Unions) können jetzt Objekte mit einem nicht trivialen Konstruktor enthalten. Wenn eine Variante ein derartiges Objekt enthält, wird der implizite Standardkonstruktor der Variante gelöscht. Der Benutzer ist daher gezwungen, den Konstruktor manuell zu definieren. Zum Beispiel:

 #include <new> // Required for placement 'new'.
  
 struct 3DPoint {
     3DPoint() {}
     3DPoint(int x, int y, int z): x_(x), y_(y), z_(z) {}
     int x_, y_, z_;
 };
  
 union U {
     double w;
     3DPoint p; // Allowed in C++11.
     U() {new(&p) 3DPoint();} // Due to the 3DPoint member, a user-defined constructor is now required.
 };

Siehe auch