Forum: PC-Programmierung C++ : kann eine Klasse ein Object von sich selbst haben?


von Harald (Gast)


Lesenswert?

Kann man in C++ eine Klasse erzeugen, die ein Objekt dieser Klasse 
beinhaltet?

Also in etwas so:
1
class Test
2
{
3
  public:
4
      Test A;
5
6
};

: Verschoben durch Moderator
von Thomas F. (Gast)


Lesenswert?

nein, aber ein (smart) pointer geht.

von Markus F. (mfro)


Lesenswert?

Harald schrieb:
> Kann man in C++ eine Klasse erzeugen, die ein Objekt dieser Klasse
> beinhaltet?

Rein interessehalber: wenn das ginge, bei welcher "Rekursionstiefe" 
würdest Du abbrechen wollen?

von jz (Gast)


Lesenswert?

Du kannst ein statisches Objekt von der Klasse selbst definieren, also
1
class Test
2
{
3
  public:
4
      static Test A;
5
};

von Dr. Sommer (Gast)


Lesenswert?

Überleg mal, wie groß eine Instanz davon wäre...

von Ben W. (ben_w)


Lesenswert?

wie einer bereits schon schrieb, mit einem pointer auf das objekt geht 
es schon.
1
class Test
2
{
3
  public:
4
      Test *A;
5
6
};

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


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.

von Achim H. (anymouse)


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
};

von Chris F. (chfreund) Benutzerseite


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
}

: Bearbeitet durch User
von TriHexagon (Gast)


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.

von Chris F. (chfreund) Benutzerseite


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
}

von Harald (Gast)


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);

von Peter II (Gast)


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.

von Chris F. (chfreund) Benutzerseite


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.

von Dr. Sommer (Gast)


Lesenswert?

Suche vielleicht mal nach "Composite Pattern "

von Harald (Gast)


Angehängte Dateien:

Lesenswert?

>Suche vielleicht mal nach "Composite Pattern "

Guter Tipp, das könnte passen.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.