C++ : kann eine Klasse ein Object von sich selbst haben?

Moderator #5064927
Dr. Sommer schrieb:
> Überleg mal, wie groß eine Instanz davon wäre...

... und unterscheide dabei zwei Fälle:

Fall 1: Test ist so deklariert wie oben.
Fall 2: Test enthält neben A noch ein weiteres Element, bspw. ein char.

:)

Und wozu wäre eine solche Klasse gut?

Ben W. schrieb:
> wie einer bereits schon schrieb, mit einem pointer auf das objekt geht
> es schon.

Oder auch eine Referenz. Für beides gibt es auch genügend sinnvolle
Anwendungen.
#5064962
stehe ich hier auf dem Schlauch (komme aus der Java-Welt), oder wäre so 
etwas in C++ wirklich ein Problem?
1
class TreeNode
2
{
3
  public:
4
      TreeNode leftNode;
5
      TreeNode rightNode;
6
};


Oder ist hier folgendes gemeint (in Java-Notation)?
1
class TreeNode
2
{
3
  public:
4
      class<TreeNode> myClazz;
5
};
Persönliche Seite #5064986
Achim H. schrieb:
> stehe ich hier auf dem Schlauch (komme aus der Java-Welt), oder wäre so
> etwas in C++ wirklich ein Problem?

Natürlich nicht. Eine verkettete liste macht man aber mit Zeigern.

Ich gebe Dir mal ein Beispiel:
1
class elem
2
{
3
public:
4
  elem * pNext;
5
  elem * pPrev;
6
  int nData;
7
};
8
int _tmain(int argc, _TCHAR* argv[])
9
{
10
  elem * pStart = new elem;
11
  pStart ->pNext = new elem;
12

13
  elem * pT = pStart->pNext->pNext = new elem;
14
  ASSERT(pT->pPrev == pStart->pNext) //schlägt fehl
15
  return 0;
16
}
Gast #5065002
Achim H. schrieb:
> stehe ich hier auf dem Schlauch (komme aus der Java-Welt), oder wäre so
> etwas in C++ wirklich ein Problem?
> class TreeNode
> {
>   public:
>       TreeNode leftNode;
>       TreeNode rightNode;
> };

Ja den in Java sind alle Typen abseits von Standardtypen wie int, long 
Referenztypen, Java legt dir damit deine Member auf Objekte von 
Klassentypen als Referenzen an. In C++ gibt es aber nur Wertetypen (im 
Java/C#-Sprech) und legt sozusagen die Objekte in das tragende Objekt 
selbst hinein. Das funktioniert hier natürlich nicht, weil das eine 
unauflösbare Rekursion darstellt, in Java ist es kein Problem da nur 
Referenzen, die ja zudem auch null sein können.
Persönliche Seite #5065011
Hier noch eine schönere Version, die auch kompiliert.
1
#include <assert.h>
2
class elem
3
{
4
public:
5
  elem() : pNext(0), pPrev(0), nData(0){};
6
  elem * pNext;
7
  elem * pPrev;
8
  int nData;
9
  elem* addNext()
10
  {
11
    pNext = new elem;
12
    pNext->pPrev = this;
13
    return pNext;
14
  }
15
  static void destroy(elem * pE)
16
  {
17
    while (pE->pPrev != 0) pE = pE->pPrev; //erstes Element finden
18
    elem * pN = 0;
19
    while (pE)
20
    {
21
      pN = pE->pNext;
22
      delete pE; pE = 0;
23
      pE = pN;
24
    }
25
  }
26
};
27
int main(int argc, char* argv[])
28
{
29
  elem * pStart = new elem;
30
  pStart->addNext()->addNext()->addNext()->addNext()->addNext();
31
  elem * pT = pStart->pNext->pNext->pNext;
32
  assert(pT->pPrev == pStart->pNext->pNext);
33
  elem::destroy(pT);
34
  return 0;
35
}
Gast #5065692
Danke für die Antworten.

Kurz zum Hintergrund meiner Frage:
Jeder kennt ja die Möglichkeit bei z.B. Powerpoint, Ojekte zu 
gruppieren. Diese kann man dann mehrfach kopieren und dann wieder zu 
neuen Objekten gruppieren.
Jetzt suche ich nach einer Art Design-Pattern für C++.
Man müsste quasi eine Klasse "Panel" machen, bei der man graphische 
Objekte wie z.B. Kreise und Dreiecke und eben auch wieder Panels 
hinzufügen könnte:
1
Panel p1;
2
Panel.add(dreieck1);
3
Panel.add(dreieick2);
4

5
Panel p2;
6
p2.add(quadrat1);
7
p2.add(quadrat2);
8

9
p1.add(p2);
Gast #5065698
Harald schrieb:
> Man müsste quasi eine Klasse "Panel" machen, bei der man graphische
> Objekte wie z.B. Kreise und Dreiecke und eben auch wieder Panels

und wo hast du damit ein Problem? Verwende doch einfach Zeiger 
(SmartPointer) und gut ist. Es ist eh sinnlos Objekte ständig zu 
kopieren.
Persönliche Seite #5065700
Harald schrieb:
> Man müsste quasi eine Klasse "Panel" machen, bei der man graphische
> Objekte wie z.B. Kreise und Dreiecke und eben auch wieder Panels
> hinzufügen könnte:

Dann lege eine (abstrakte) Basisklasse an, die einen Container für 
Objekte von "sich selbst" enthält.

Die Inhaltstypen erben dann davon und bei den Klassen am Ende vom Baum 
blendest Du den (Zugriff auf den) Container aus.
(Firma: Torrox.de) #5065859
Achim H. schrieb:
> stehe ich hier auf dem Schlauch (komme aus der Java-Welt), oder wäre so
> etwas in C++ wirklich ein Problem?

In Java ist jedes Symbol nur ein Zeiger auf ein Objekt. In C++ ist das 
bei gleicher Syntax immer ein Objekt:
1
Type obj1 = f();
2
Type obj2 = obj1;

In Java sind obj1 und obj2 zwei Zeiger auf das selbe Objekt. In C++ sind 
obj1 und obj2 zwei unterschiedliche Objekte, die den gleichen Wert haben 
(sollten).

Ähnliches Verhalten erhältst Du in C++ mit Zeiger, Referenzen und 
Smart-Pointern.
Beitrag #5138098 wurde von einem Moderator gelöscht.
Beitrag #5142608 wurde von einem Moderator gelöscht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.