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

Moderator #5064927
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren