JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=beab3ce2b4879d2c69619cd36bb71323Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Abstrakte Klassen und Interfaceimplementierungen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 24.08.2007, 11:46    Titel: Abstrakte Klassen und Interfaceimplementierungen Antworten mit Zitat

Hallo JLI,

ich hab dann auch mal ne Frage. Ich habe 3 Interfaces, B und C leiten sich von A ab.
CPP:
class A {
   virtual void a() = 0;
};
class B : public A {
   virtual void b() = 0;
};
class C : public A {
   virtual void c() = 0;
};


Welche ich implementieren möchte. Natürlich möchte ich die funktion a() nur einmal implementieren also mache ich es wie folgt:

CPP:
class AImpl {
   virtual void a(){...};
};
class BImpl : public AImpl, B {
   virtual void b(){...};
};
class CImpl :  public AImpl, C {
   virtual void c(){...};
};


Also eigentlich.. ziemlich logisch und in anderen Objektorientierten Sprachen so absolut gar kein Problem (Java z.B.).
Aber mein lieber Freund GCC beschwert sich dass man BImpl und CImpl nicht instanziieren kann weil a() nicht implementiert ist.
Ich denke es liegt an problemen beim zusammenstellen der vtable, jemand ne ahnung wie man das lösen könnte? (außer in BImpl und CImpl ein virtual void a(){ AImpl::a(); } einzufügen?)

gruß,
xardie
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 24.08.2007, 14:59    Titel: Antworten mit Zitat

hi xardie =),

also du hast die Funktion A::a() rein virtuell deklariert (wegen =0), wahrscheinlich um A zu einer abstrakten Klasse zu machen. Methoden die rein virtuell deklariert sind, müssen aber in den abgeleiteten Klassen neu implementiert werden; das ist der (bzw. ein) Unterschied zwischen virtuellen und rein virtuellen Methoden. Letztere können, müssen aber nicht in der abgeleiteten Klasse implementiert werden. Du könntest also die Funktionen a, b und c allesamt virtuell deklarieren, mit einer Standardimplementation. Dann hättest du aber das Problem, dass A, B und C keine abstrakten Klassen mehr sind. Für solche Probleme (wo du eine abstrakte Klasse ohne rein virtuelle Methoden haben musst) gibt es eine verbreitete Lösung(s. "Effektiv C++ programmieren"): Du musst den Destruktor einer Klasse rein virtuell deklarieren und für ihn trotzdem eine Implementierung darstellen. Eine andere Mögl. wäre z.B. auch, die Methode A::a() durch eine using deklaration in einer abgeleiteten Klasse private zu deklarieren, das stößt aber auf andere neue Probleme

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 24.08.2007, 17:32    Titel: Antworten mit Zitat

Xardie, mach das =0 weg, wie DirectXer schon gesagt hat, oder gib jedem Delegat eine Methode a, die die Parentmethode aufruft. Welcome to C++.. ;)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.08.2007, 18:01    Titel: Antworten mit Zitat

Wegen diesem Problem bin ich damals von C++ zu C# gewechselt.
Weil C# einen Unterschied zwischen Abstrakter Klasse und Interface kennt, kommt C# mit deinem Szenario klar, C++ jedoch nicht..
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 25.08.2007, 07:17    Titel: Antworten mit Zitat

Hazel hat Folgendes geschrieben:
Welcome to C++.. Wink

*seufz* ich sollte mir abgewöhnen nach stilistisch korrekten lösungen zu suchen.

Danke Jungs Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 25.08.2007, 17:00    Titel: Antworten mit Zitat

Stilistisch korrekt ist nicht unbedingt gleich gut!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum