Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

29.04.2012, 23:56

[C++] Implementieren von Methoden

Wie kann ich es bewerkstelligen, dass Klassen Methoden implementieren (Init(),Exit(),Load(),Unload()...)?
Ich habe mehrere Klassen, welche die gleichen Methoden besitzen.
ich habe es mit einer Schnittstelle versucht und die Klassen erben lassen, doch beim Implementieren kommt der Fehler: Ein vererbter Member ist nicht zulässig.
Mit einer Klasse als Basis war es das Gleiche. Ich weiß, ich könnte die Methoden virtual machen und dann überschreiben, aber dann müsste ich die Methoden in allen Klassen deklarieren und das würde nichts ändern (ich will bewerkstelligen, dass ich es nicht in allen Klassen deklarieren muss).

Gibt es in C++ nicht sowas, was man in Java mit 'implements' macht?

Danke im Voraus
birdfreeyahoo

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

30.04.2012, 00:33

Wenn du in Java ein Interface implementierst, musst du den Code auch in jeder abgeleiteten Klasse festlegen. Sonst würde das ja keinen Sinn machen. Du kannst in C++ eine abstrakte Klasse machen, oder halt virtuelle Methoden benutzen. Abstrakte Klassen kennst du ja vielleicht auch von Java. Da wird es mit "extends" angegeben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

3

30.04.2012, 01:15

Wie kann ich es bewerkstelligen, dass Klassen Methoden implementieren (Init(),Exit(),Load(),Unload()...)?
Ich habe mehrere Klassen, welche die gleichen Methoden besitzen.
ich habe es mit einer Schnittstelle versucht und die Klassen erben lassen, doch beim Implementieren kommt der Fehler: Ein vererbter Member ist nicht zulässig.
Mit einer Klasse als Basis war es das Gleiche. Ich weiß, ich könnte die Methoden virtual machen und dann überschreiben, aber dann müsste ich die Methoden in allen Klassen deklarieren und das würde nichts ändern (ich will bewerkstelligen, dass ich es nicht in allen Klassen deklarieren muss).

Haben die implementierungen die selbe funktionalitaet und du willst sie in allen klassen haben? Dann solltest du die Funktion in einer Parent Klasse unterbringen.

Wenn du das Interfaces Konzept aus Java suchst dann bist du mit den virtuellen Methoden genau da wo du hin musst. Ein Interface ist in C++ einfach eine Klasse die nur public/pure virtual Methoden besitzt.
Und das Interface kannst du ueber Vererbung implementieren.

Was genau willst du anstellen? Ich habe das Gefuehl da ist ein Denkfehler drin bei dem was du vor hast...

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

30.04.2012, 09:04

Du musst immer noch mal explizit deklarieren, dass die erbende Klasse diese Methode wieder implementiert.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

30.04.2012, 18:50

Also heißt es, dass ich um eine Deklaration in jeder Klasse nicht umhin komm? Denn die Methoden haben ja nicht den gleichen Inhalt, sie heißen nur gleich.

Danke für die bisherigen Antworten.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

30.04.2012, 19:15

Also heißt es, dass ich um eine Deklaration in jeder Klasse nicht umhin komm?

Ja!
Jede Methode, die in der .cpp definiert wird muss in der .h deklariert sein. Wäre das nicht so würde man sich ziemlich oft fragen wieso dort eine Methode definiert ist, die in der Klasse nicht deklariert ist. Es ist übrigens nicht nötig sie nochmal als virtual zu deklarieren, sollte aber unbedingt gemacht werden um zu zeigen, dass sie vererbt wurde.

Der Destruktor sollte in der Basisklasse (und in den abgeleiteten Klassen) virtual deklariert und definiert werden. Auch wenn er leer ist.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

02.05.2012, 09:28

Also heißt es, dass ich um eine Deklaration in jeder Klasse nicht umhin komm? Denn die Methoden haben ja nicht den gleichen Inhalt, sie heißen nur gleich.

Danke für die bisherigen Antworten.


Ja, du musst explizit sagen, was du überschreibst, was nicht. Ich habe hier mal ein kleines Beispiel, was sonst nicht funktioniert. Wichtig zu beachten ist, wenn dein Projekt auf mehrere Dateien aufgeteilt ist, was häufig der Fall sein wird, wird der Compiler typischerweise von den meisten Klassen nur die Deklarationen kennen.

Nehmen wir an, wir haben einige Klassen, die verschiedene Varianten einer Liste implementieren sollen. Natürlich möchte man die Listenimplementationen schnell austauschen können, also macht man ein Interface IList:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class IList 
{
public:
   virtual ~IList ();
   virtual void Add (...) = 0;
   virtual void Remove (...) = 0;
   ...
   virtual void QuickSort (...) = 0;
}


Das soll jetzt nur ein Beispiel sein. ;)

Den Quicksort Algorithmus wird man nur einmal implementieren wollen, der ist ja eigentlich unabhängig von der Liste. Also machen wir eine Klasse, die nur den implementiert!

C-/C++-Quelltext

1
2
3
4
5
6
class AbstractList : public IList
{
public:
  virtual ~AbstractList ();
  virtual QuickSort (...);  
}


So, ich habe explizit angegeben, dass AbstractList die Methode QuickSort implementiert. Damit ist die Klasse aber immer noch abstrakt, d.h. ich kann keine Instanz von ihr anlegen. Add und Remove sind ja nach wie vor nicht implementiert. Also kommen nun die verschiedenen Implementationen.

C-/C++-Quelltext

1
2
3
4
5
class DoubleLinkedList : public AbstractList
{
   ...
}
etc.


Und da dein Compiler eigentlich nur die Implementationen zur Analyse zur Verfügung hat, wenn er gerade die cpp-Dateien dieser Klasse kompiliert, musst du noch mal explizit angeben was deine Klasse nun wirklich implementiert, damit der Compiler sagen kann, dass DoubleLinkedList instanziert werden kann und AbstractList nicht. Und IList sowieso nicht.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Legend« (02.05.2012, 09:36)


Werbeanzeige