Verschachtelte Klassen in C++

Jinku Hu 12 Oktober 2023
Verschachtelte Klassen in C++

In diesem Artikel wird erläutert, wie verschachtelte Klassen und Strukturen in C++ funktionieren.

Definieren Sie ein class- oder struct-Objekt innerhalb einer anderen Klasse in C++

Manchmal benötigen unsere Klassen sogenannte Hilfsdatentypen, die normalerweise als benutzerdefinierte struct- oder class-Objekte definiert sind. Diese Hilfsklassen können innerhalb der anderen Klassen definiert werden und werden in solchen Fällen als verschachtelte Typen oder verschachtelte Klassen bezeichnet. Letzteres Konzept bietet viele Vorteile für den Programmierer, wie gute Bereichsgrenzen und Zugriffskontrolle.

Das folgende Beispiel wird gezeigt, um ein einfaches Szenario zu demonstrieren, in dem wir eine verschachtelte Klasse definieren könnten. Die Hauptklasse - CircularList implementiert eine zirkuläre verkettete Liste und muss einen Knoten definieren, der ein zusammengesetzter Typ ist, genannt - ListNode. Letztere wird in diesem Fall im globalen Geltungsbereich mit dem Schlüsselwort struct definiert. Daher sind seine Mitglieder für andere Klassen öffentlich zugänglich.

#include <iostream>
#include <string>

using std::string;

struct ListNode {
  struct ListNode *next = nullptr;
  string data;
} typedef ListNode;

class CircularList {
 public:
  explicit CircularList(string data) {
    head = new ListNode;
    head->next = head;
    head->data = std::move(data);
    end = head;
  };

  ListNode *insertNodeEnd(string data);
  ListNode *insertNodeHead(string data);
  void printNodes();

  ~CircularList();

 private:
  ListNode *head = nullptr;
  ListNode *end = nullptr;
};

int main() { return EXIT_SUCCESS; }

Alternativ können wir die Definition ListNode in die Klasse CircularList verschieben. ListNode ist im globalen Namensraum nicht zugänglich, daher müssen wir den Namensraum CircularList:: vor den verschachtelten Klassennamen einfügen. Außerdem ist es wichtig, welchen Zugriffsbezeichner die geschachtelte Klasse hat, da auch für sie die üblichen Zugriffskontrollregeln gelten.

In diesem Fall ist ListNode als öffentliche Memberklasse definiert und kann folglich von der Funktion main mit der Notation CircularList::ListNode aufgerufen werden. Wenn eine verschachtelte Klasse als geschütztes Member definiert ist, kann auf sie über die einschließende Klasse, deren Freundklassen und abgeleitete Klassen zugegriffen werden. Andererseits würde ein private Spezifizierer für eine verschachtelte Klasse bedeuten, dass sie nur innerhalb der einschließenden Klasse und der Freundklasse zugänglich ist.

#include <iostream>
#include <string>

using std::string;

class CircularList {
 public:
  // Helper Types ->
  struct ListNode {
    struct ListNode *next = nullptr;
    string data;
  } typedef ListNode;

  // Member Functions ->
  explicit CircularList(string data) {
    head = new ListNode;
    head->next = head;
    head->data = std::move(data);
    end = head;
  };

  ListNode *insertNodeEnd(string data);
  ListNode *insertNodeHead(string data);
  void printNodes();

  ~CircularList();

 private:
  ListNode *head = nullptr;
  ListNode *end = nullptr;
};

int main() {
  //    ListNode *n1; // Error
  CircularList::ListNode *n2;

  return EXIT_SUCCESS;
}

Im Allgemeinen kann eine verschachtelte Klasse übliche Zugriffsspezifizierer für ihre Mitglieder haben, und die Regeln gelten wie gewohnt für die einschließende Klasse. Währenddessen wird einer geschachtelten Klasse kein besonderer Zugriff auf die Mitglieder der einschließenden Klasse gewährt.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Class