Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pointer auf Objekte beliebiger Klassen (C++) (https://www.delphipraxis.net/120702-pointer-auf-objekte-beliebiger-klassen-c.html)

Torpedo 15. Sep 2008 15:14


Pointer auf Objekte beliebiger Klassen (C++)
 
Hallo,
ich frage mich gerade ob ich einen Zeiger erstellen kann, der auf verschiedene Klassen zeigen kann.

Ich habe z.B. die Klassen
  • cTier
  • cKatze (erbt von cTier)
  • cHund (erbt von cTier)
  • cFisch (erbt von cTier)
  • cGoldfisch (erbt von cFisch)

Und jetzt habe ich z.B. eine Klasse cPerson mit einer Zeiger-Variable "Haustier", welche auf ein beliebiges Tier zeigen soll.

Wie geht das?

Also ungefähr so:

cTier *lieblingstier = new cGoldfisch("Goldi");

Geht aber leider nicht.

mkinzler 15. Sep 2008 15:16

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Versuch mal zu casten

Torpedo 15. Sep 2008 15:18

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Dann muss ich aber wissen welche Klasse es ist und das weiß ich nicht.
Kann man das irgendwie herausfinden?

xy124 15. Sep 2008 15:22

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
ich glaub der fehler ist das leerzeichen und der stern ;)
Zitat:

cTier *lieblingstier = new cGoldfisch("Goldi");
ist falsch.
probier' mal
Code:
cTier* lieblingstier = new cGoldfisch("Goldi");
^^der stern muss hinter den klassenname und nicht vor den objektname!

Torpedo 15. Sep 2008 15:26

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Funktioniert leider auch nicht.

BTW: Ich schreibe den Stern oft am Klassenname, oft an der Variable und oft dazwischen. Funktioniert eigentlich immer wie erwartet. ;)
Macht wohl keinen Unterschied...

jfheins 15. Sep 2008 15:27

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Zitat:

Zitat von Torpedo
Dann muss ich aber wissen welche Klasse es ist und das weiß ich nicht.
Kann man das irgendwie herausfinden?

Musst du nicht ;)

Code:
cTier *lieblingstier = (cTier)new cGoldfisch("Goldi");

Torpedo 15. Sep 2008 15:38

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Ja hier geht es, aber das soll mal alles dynamisch zugewiesen werden. Da weiß ich dann nicht mehr wie.

Beispiel

Code:
void setLieblingstier( ???? tier )
{
   lieblingstier = (cTier)tier;
}


??? getLieblingstier()
{
   return (???)lieblingstier;
}

mkinzler 15. Sep 2008 15:42

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Code:
void setLieblingstier( ctier *tier )
{
   lieblingstier = tier;
}


ctier getLieblingstier()
{
   return lieblingstier;
}

Torpedo 15. Sep 2008 15:47

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Kann ich denn auch ein cGoldfisch übergeben, wenn die Funktion ein cTier erwartet?
Ich dachte das getestet zu haben. Da ging es nicht...

Edit: Ja, mit cast ;)

Aber irgendwann muss sich wissen was es für eine Klasse ist, sonst kann ich die Funktionen, die nur zu der Klasse gehören nicht benutzen...

DMW 15. Sep 2008 16:03

Re: Pointer auf Objekte beliebiger Klassen (C++)
 
Zitat:

Zitat von Torpedo
Wie geht das?

Also ungefähr so:

cTier *lieblingstier = new cGoldfisch("Goldi");

Genau so.


Zitat:

Zitat von Torpedo
Geht aber leider nicht.

Warum nicht?
Kann es sein, daß du übersehen hast, daß Basisklassen standardmäßig private sind und explizit als public deklariert werden müssen?

Code:
class cTier { ... };
class cGoldfisch : public cTier { ... };

Zitat:

Zitat von xy124
ich glaub der fehler ist das leerzeichen und der stern Wink
Zitat:
cTier *lieblingstier = new cGoldfisch("Goldi");
ist falsch.
probier' mal
Code: markieren
cTier* lieblingstier = new cGoldfisch("Goldi");

^^der stern muss hinter den klassenname und nicht vor den objektname!

Unfug. Ob zwischen Operatoren und Bezeichnern Leerzeichen sind, ist vollkommen irrelevant, wie in Delphi übrigens auch.


Zitat:

Zitat von jfheins
cTier *lieblingstier = (cTier)new cGoldfisch("Goldi");

Was genau hast du da vor? cGoldfisch -> cTier -> cTier*?


Zitat:

Zitat von Torpedo
Aber irgendwann muss sich wissen was es für eine Klasse ist, sonst kann ich die Funktionen, die nur zu der Klasse gehören nicht benutzen...

Dafür gibt es dynamic_cast<>.

Der Cast nach der Art (Typ)Ausdruck nennt sich "C-Cast" und ist in C++ zu Recht verpönt. Man nehme static_cast<> oder dynamic_cast<>.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz