Problem mit Software Architektur (C++)
-
Und warum gibt es dann IResource wenn es eh AbstractResource gibt?
Damit man immer noch die Möglichkeit hat eine Implementierung zu schreiben, welche die Standardaufgaben anders löst als AbstractResource.
-
Ishildur schrieb:
Und warum gibt es dann IResource wenn es eh AbstractResource gibt?
Damit man immer noch die Möglichkeit hat eine Implementierung zu schreiben, welche die Standardaufgaben anders löst als AbstractResource.
Sie ist doch abstract
-
Ishildur schrieb:
Irgendwie hab ich das Gefühl, du hast nicht verstanden, wozu virtual Vererbung in C++ da ist.
Wie gesagt ich masse mir nicht an alles zu wissen und zu verstehen, ich lerne gerne dazu
Es gibt natürlich probleme, wenn nun zwei Interfaces eine Methode mit demselben Namen sowie derselben Signatur anbieten.
[/cpp]Nich ganz.
http://en.wikipedia.org/wiki/Virtual_inheritance
Oder kurz: Damit eine Basisklasse nur einmal in einer Derivedklasse landet, die von 2 Klassen erbt, die von der Basis erben.
-
Sie ist doch abstract
Also hat sie members, welche (mit grosser Wahrscheinlichkeit) von der alternativen Implementierung nicht benötigt werden
-
@jokester
Ja diesen Artikel kenne ich mittlerweile auch (seit gestern 17:08) als das erste mal der Begriff "Virtuell Erben" gefallen istAber ist denn virtuelle Vererbung von Klassen, welche ausschliesslich pure virtuelle Methoden beinhaltet nicht mit den C# und Java interfaces identisch?
-
Selfquote:
Dravere schrieb:
Übrigens: Wieso gibst du bei
GetName
dasstd::string
Objekt als Zeiger zurück? Ist auch einer der Indikatoren, dass du anscheinend ziemlich viel mitnew
anlegst.Würde mich noch interessieren
Ishildur schrieb:
Ich denke, dafür is virtuelle Verwebung da, damit die Methode GetName nicht doppeldeutig ist. Ich will ja nicht, dass MyObjekt dem Logger und dem Skriper zwei unterschiedliche Namen zurückgibt.
Du hast
virtual
Vererbung definitiv nicht verstanden. Einevirtual
Vererbung geschieht auf der Ebene der Klasse/Objekt. Mit Methoden aus zwei unterschiedlichen Klassen hat das nichts zu tun. Bei deinem Beispiel kannst duvirtual
auch gleich weglassen bei der Vererbung.Wenn du zwei Methoden mit gleichen Namen aus unterschiedlichen Klassen hast, welche auch eine Implementation aufweisen (also nicht pure virtual sind), dann hilft auch die
virtual
Vererbung nichts mehr. Beim Aufruf einer solchen Methode, musst du dann explizit angeben, welche du aufrufen möchtest.Ishildur schrieb:
Sie ist doch abstract
Also hat sie members, welche (mit grosser Wahrscheinlichkeit) von der alternativen Implementierung nicht benötigt werden
Und mit welcher Wahrscheinlichkeit tritt dieser Fall auf?
Grüssli
-
Ishildur schrieb:
Sie ist doch abstract
Also hat sie members, welche (mit grosser Wahrscheinlichkeit) von der alternativen Implementierung nicht benötigt werden
Verstehe ich nicht. Welche Member sollte sie denn haben? Kann mir nicht vorstellen dass das oft vorkommt - also bei mir zB noch nie.
Weil du dann ja recht schnell konkret wirst und nicht mehr abstrakt bist...
worum es aber eigentlich geht: dein code sieht wie java code und nicht wie c++ code aus.
-
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :p
-
brigens: Wieso gibst du bei GetName das std::string Objekt als Zeiger zurück? Ist auch einer der Indikatoren, dass du anscheinend ziemlich viel mit new anlegst.
Nein ich will nur nicht, dass der string jedes Mal kopiert wird, wenn ich einen Namen abfrage
-
Ishildur schrieb:
Aber ist denn virtuelle Vererbung von Klassen, welche ausschliesslich pure virtuelle Methoden beinhaltet nicht mit den C# und Java interfaces identisch?
Hat nichts miteinander zu tun. C++ virtual vererbung ist wirklich nur fuer den deadly diamond.
-
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pSpricht nicht gegen die Aussage von Shade Of Mine. Kann gut sein, dass du ein Stil für C++ und Java anwendest, was definitiv falsch ist. Man muss für jede Sprache anders programmieren. Oder du programmierst in Java wirklich wie in C++ und in C++ wie in Java. Dann solltest du auf beides mal ein
std::swap
anwendenGrüssli
-
Ishildur schrieb:
brigens: Wieso gibst du bei GetName das std::string Objekt als Zeiger zurück? Ist auch einer der Indikatoren, dass du anscheinend ziemlich viel mit new anlegst.
Nein ich will nur nicht, dass der string jedes Mal kopiert wird, wenn ich einen Namen abfrage
Dafür benutzt man eigentlich Referenzen...
-
std::swap
-
Nein, jetzt bitte nicht noch eine Diskussion ob und wann nun Zeiger oder Referenzen sinnvoller sind :p
-
Ishildur schrieb:
brigens: Wieso gibst du bei GetName das std::string Objekt als Zeiger zurück? Ist auch einer der Indikatoren, dass du anscheinend ziemlich viel mit new anlegst.
Nein ich will nur nicht, dass der string jedes Mal kopiert wird, wenn ich einen Namen abfrage
Schon mal davon gehört, dass man Referenzen auf konstante Objekte zurückgeben kann?
class MyObject { private: std::string m_name; public: std::string const& getName() { return m_name; } };
Und schon findet keine Kopie satt. Zudem verwenden gewisse Bibliotheken bei
std::string
COW (Copy-On-Write). Und nicht zuletzt, ist es recht fragwürdig, wie stark diese Kopie wirklich ins Gewicht der Performance fällt, da ich mal vermutet, dass du es deswegen nicht machen möchtest.Zudem, du gibst immer einen Zeiger auf ein nicht-konstantes Objekt zurück, wodurch man den Namen von Aussen verändern kann. Bye Bye Kapselung ...
Grüssli
PS: Ich ziehe mich vorerst zurück. Muss noch ein paar Schnittstellenspezifikationen erstellen, dieser Thread geht mir gerade ein wenig zu schnell vorwärts
-
@Dravere
Ja ich werde mich jetzt einmal umfassend mit dem Thema Mehrfachvererbung auseinandersetzten bevor ich nochmal ins Messer laufeVielen Dank an alle für die vielen Tips in diesem Thread!
-
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
-
Shade Of Mine schrieb:
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
http://www.ibm.com/developerworks/java/library/j-noaccent.html
-
SeppJ schrieb:
Shade Of Mine schrieb:
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
http://www.ibm.com/developerworks/java/library/j-noaccent.html
Das geht leider nur auf C ein...
-
Shade Of Mine schrieb:
SeppJ schrieb:
Shade Of Mine schrieb:
Ishildur schrieb:
@Shade Of Mine
Hahaha, in den Java Foren jammern sie, mein Code sehe wie C/C++ Code aus :pHast du einen Link dazu? Würde mich einfach nur interessieren was Java Programmierer darunter verstehen.
http://www.ibm.com/developerworks/java/library/j-noaccent.html
Das geht leider nur auf C ein...
Die letzten paar Punkte sind C++ und ein paar der C Punkte treffen auch auf C++ zu. Aber insgesamt sind es eher Kleinigkeiten. Vermutlich meinen die Leute in Ishildurs Java-Forum noch viel stärkere Stilunterschiede. So wie man hier ehemalige Java-Programmierer daran erkennt, dass sie alles auf den Heap legen. Wobei das umgekehrt in Java natürlich nicht geht, einen C++ Programmierer an der Stack-Nutzung zu erkennen. Eventuell ist gemeint, dass C++ Programmierer in Java hinter sich sauber aufräumen, anstatt sich auf die Garbage-Collection zu verlassen.