Forum: PC-Programmierung C++ als C Könner lernen


von Student (Gast)


Lesenswert?

Ich programmiere schon seit ein paar Jahren C und wrüde sagen, dass ich 
auch ganz gut darin bin. Dieses Semeser habe ich eine C-Lehrveransatung 
mit der Höchstunktezahl abgeschlossen und habe nächstes Semester gibt es 
die Möglichkeit dass ich eine Lernveranstaltung in der man C++ lernt als 
Freifach absolviere, das würde mich auch interessieren. Bevor ich nich 
dazu anmelde wollte ich mir noch kurz euere Meinungen hohlen, wie 
schwierig ihr es einshätzt C++ noch dazuzulernen.

Danke für euere Meinungen.

: Verschoben durch Admin
von Klaus W. (mfgkw)


Lesenswert?

Die schlechte Nachricht:
alles zu C++ lernen = keine Chance, das dauert ewig

Die gute Nachricht:
Man braucht von C++ nicht alles gleichzeitig, sondern kann sich 
stückweise rantasten.
Also template-Funktionen, Operatoren überladen, OO, STL etc. kann man 
nacheinander angehen.

Das langwierigste ist sicher, die OO-Denkweise zu verinnerlichen.

: Bearbeitet durch User
von kaese (Gast)


Lesenswert?

Student schrieb:
> Bevor ich nich
> dazu anmelde wollte ich mir noch kurz euere Meinungen hohlen, wie
> schwierig ihr es einshätzt C++ noch dazuzulernen.

Der C++-Standard hat ca. 1500 Seiten. Ziemlich komplexe Syntax.

Im Gegensatz zu C, behaupte ich, kann man diese Sprache niemals 
vollständig beherrschen.

Scott Meyers -  einer der heiligsten C++ Gurus - hat mal auf einer 
Konferenz gesagt, er wünscht sich eine Sprache, wo man Leute wie ihn 
nicht benötigt ;-) Er hat viele Bücher über die unendlichen Fallstricke 
verfasst.


Lass dich bitte von den Uni-Klausuren und "Voller Punktzahl" nicht 
betrügen. Es ist war anderes in Großprojekt mit mehreren tausend Zeilen 
Code C wiederverwendbar zu beherrschen als ein paar 
Colaautomaten-Funktionen in einer 90-Minütigen Klausur zu tippseln.

von möbius (Gast)


Lesenswert?

c anteile findest du in c++ und c#.
die sache ist, dass man in der regel nicht alles gleich gut beherrschen 
kann.
kannst du das eine gut, wird das andere etwas verdrängt.
c sollte man für den embedded bereich beherrschen und c++ oder c#
für den pc bereich für objektorientierte programmierung.
besuche den c++ kurs. egal ob schwer oder leicht.

die sprachen sind nur werkzeuge.
je besser du ein werkzeug beherrscht, desto besser für dich und dein 
produkt.

von Dr. Sommer (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Das langwierigste ist sicher, die OO-Denkweise zu verinnerlichen
Als ob, das ist noch schön einfach und leicht vorstellbar. Warum immer 
alle Angst vor OOP haben verstehe ich nicht. Auch viele C-Programme 
verwenden OOP, und man kann auch C++ ohne OOP nutzen.
Viel spaßiger als OOP ist die "richtige" Template/Meta Programmierung, 
Speicherverwaltung, rvalue references, korrekte Exception Sicherheit bei 
Meta Programmierung...
Allerdings sollte das natürlich nicht abschrecken, C++ zu lernen - diese 
fortgeschrittenen Dinge braucht man nicht um schöne Anwendungen zu 
programmieren, und im Endeffekt kann man mit C++ schnell und effizient 
programmieren.
Auch allgemein lohnt es sich über den C-Tellerrand zu blicken, und neue 
Programmierparadigmen zu lernen.

von Ratgeber (Gast)


Lesenswert?

kaese schrieb:
> Der C++-Standard hat ca. 1500 Seiten. Ziemlich komplexe Syntax.
>
> Im Gegensatz zu C, behaupte ich, kann man diese Sprache niemals
> vollständig beherrschen.

Naja, das "Datenblatt" des Atmega1284 hat z.B. 659 Seiten. Trotzdem wird 
hier ja auch von jedem Anfänger verlangt, es auswändig zu kennen...
;-)

von Bernd K. (prof7bit)


Lesenswert?

Ratgeber schrieb:
> Naja, das "Datenblatt" des Atmega1284 hat z.B. 659 Seiten. Trotzdem wird
> hier ja auch von jedem Anfänger verlangt, es auswändig zu kennen...

Das ist nicht wahr. Niemand hat das je verlangt. Noch nichtmal hier.

von Moby A. (moby-project) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Das langwierigste ist sicher, die OO-Denkweise zu verinnerlichen.

Das allein würde mir schon arg zu denken geben ob diese Denkweise der 
Weisheit letzter Schluß ist. Das Werkzeug sollte sich dem Menschen 
anpassen, nicht umgekehrt.

von Martin (Gast)


Lesenswert?


von FelixW (Gast)


Lesenswert?

Student schrieb:
> Bevor ich nich
> dazu anmelde wollte ich mir noch kurz euere Meinungen hohlen, wie
> schwierig ihr es einshätzt C++ noch dazuzulernen.

Ich vermute dahinter versteckt sich "Objektorientiertes Programmieren am 
Beispiel C++".

Objektorientiertes Programmieren (wie strukturiere ich ein Programm in 
getrennte Einheiten die einen) lohnt sich, das Konzept ist aber nicht 
auf C++ beschränkt. Gibt allerdings ein paar Kopfnüsse zu knacken.

C++ selber ist recht einfach, wenn du C beherrscht. Die meisten C 
Programme sind auch C++ Programme.

Allerdings macht man einige Dinge in C++ anders als in C. Man hat mehr 
Möglichkeiten,
a) um besseren Code zu schreiben
b) durch nicht Wissen schlechteren Code zu schreiben
c) einige komplizierte/mächtige Konstrukte durch einfache 
Schlüsselwörter zu ersetzen (davon viele Schlüsselwörter um OOP 
einfacher zu implementieren)
d) Mächtigere Funktionen um Code zu erzeugen / zu verändern

Schau mal, ob C++11 / C++14 Erwähnung findet. Durch die Erweiterung der 
Sprache hat sich einiges geändert.

Gruß Felix

von Hans-Georg L. (h-g-l)


Lesenswert?

Schau mal hier:

http://www.mindviewinc.com/Books/downloads.html

Bruce Eckel's Thinking in .. Serie ist für OO denken lernen nicht 
schlecht.

von Rolf M. (rmagnus)


Lesenswert?

Ratgeber schrieb:
> Naja, das "Datenblatt" des Atmega1284 hat z.B. 659 Seiten. Trotzdem wird
> hier ja auch von jedem Anfänger verlangt, es auswändig zu kennen...

Es wird eigentlich nur verlangt, da auch reinzuschauen, wenn man eine 
Frage hat, statt reflexartig hier zu posten und zu erwarten, daß andere 
für einen die Stelle im Datenblatt raussuchen.

Moby AVR schrieb im Beitrag #3995305:
> Klaus Wachtler schrieb:
>> Das langwierigste ist sicher, die OO-Denkweise zu verinnerlichen.
>
> Das allein würde mir schon arg zu denken geben ob diese Denkweise der
> Weisheit letzter Schluß ist. Das Werkzeug sollte sich dem Menschen
> anpassen, nicht umgekehrt.

Es ist genau anderes herum, als das, was du daraus schließt. OOP 
beschreibt die Sache eigentlich in einer für den Menschen viel 
gewohnteren Art. Deshalb wurde OOP ja überhaupt erst erfunden. Die 
prozedurale Programmierung ist eher die an den Computer angepasste 
Denkweise. Das Problem ist deshalb nicht OOP an sich, sondern der 
Wechsel von prozeduraler Programmierung zu OOP. Wenn du die 
Programmierung gleich mit OOP lernst, wirkt das alles ganz natürlich. 
Wenn du aber schon prozedurale Programmierung gewöhnt bist, mußt du dich 
erst wieder komplett umgewöhnen.

Dr. Sommer schrieb:
> Warum immer alle Angst vor OOP haben verstehe ich nicht. Auch viele C-
> Programme verwenden OOP,

Einige davon aber nicht so richtig, sondern nutzen ein paar Elemente 
davon, teils ohne es wirklich zu merken.

von Klaus W. (mfgkw)


Lesenswert?

Rolf Magnus schrieb:
> Es ist genau anderes herum, als das, was du daraus schließt. OOP
> beschreibt die Sache eigentlich in einer für den Menschen viel
> gewohnteren Art.

Naja, es kommt schon auch auf die Art des Problems an.
LED-Blinken ist OO auch nicht einfacher als prozedural, im Gegenteil.
Das sieht man ja schon daran, daß Java sinnloserweise eine Klasse mit 
einer public static void main-Methode braucht; das ist ja eine 
Vergewaltigung von OOP für etwas, was von der Natur her nicht OO ist: 
"fang hier an...".

Ab einer gewissen Komplexität hast du aber natürlich recht, aber das ist 
nicht Mobys Welt.

von LeuteGibtsTzTzTz (Gast)


Lesenswert?

Bernd K. schrieb:
>> Naja, das "Datenblatt" des Atmega1284 hat z.B. 659 Seiten. Trotzdem wird
>> hier ja auch von jedem Anfänger verlangt, es auswändig zu kennen...
>
> Das ist nicht wahr. Niemand hat das je verlangt. Noch nichtmal hier.

Schmeiss mal Google an und suche nach der Bedeutung von:   ;-)

Humorloser Unhold du!!!

Und falls du's immer noch nicht geschnallt hast, der Autor dieser Zeilen 
hat GESCHERZT.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Student schrieb:
> Bevor ich nich
> dazu anmelde wollte ich mir noch kurz euere Meinungen hohlen, wie
> schwierig ihr es einshätzt C++ noch dazuzulernen.

Wie schon geschrieben: OOP-Programmieren lernen lohnt sich auf jeden 
Fall! Auf einem PC oder für Android z.B. auch mit C# oder Java.

Aus den "Fehlern" die C++ gemacht hat, haben diese neueren Sprachen 
gelernt, daher ist hier vieles einfacher, für µC jedoch weniger 
geeignet.

Warum? Falls es um C++ auf einem µC geht, siehe:

http://scottmeyers.blogspot.de/2013/02/schulungsunterlagen-zur-anwendung-von-c.html

Das wäre dann die Pflichtlektüre vom Guru^^. Ich habe 2 Tage gebraucht, 
um alles zu verstehen.

Aber ich denke, bei Dir wird es um Programmierung auf einem PC 
(Linux/Windows/...) gehen, oder?

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Klaus Wachtler schrieb:
> Rolf Magnus schrieb:
>> Es ist genau anderes herum, als das, was du daraus schließt. OOP
>> beschreibt die Sache eigentlich in einer für den Menschen viel
>> gewohnteren Art.
>
> Naja, es kommt schon auch auf die Art des Problems an.
> LED-Blinken ist OO auch nicht einfacher als prozedural, im Gegenteil.

Ja, wer nicht über die blinkende LED hinaus blicken kann, kann mit OOP 
natürlich nichts anfangen.

> Ab einer gewissen Komplexität hast du aber natürlich recht, aber das ist
> nicht Mobys Welt.

Allerdings. Es kommt aber auch darauf an, wie stark man abstrahiert. Es 
ist auch möglich, "zuviel OOP" zu machen und sich in nachher niemals 
notwenigen Klassenhierarchien zu verkünsteln. Aber jedes 
Programmierwerkzeug kann missbraucht werden. Wie hieß es so schön? You 
can write FORTRAN in any language.


> Das sieht man ja schon daran, daß Java sinnloserweise eine Klasse mit
> einer public static void main-Methode braucht; das ist ja eine
> Vergewaltigung von OOP für etwas, was von der Natur her nicht OO ist:
> "fang hier an...".

Deshalb finde ich es auch gut, daß C++ OOP nicht fest erzwingt, wie es 
Java tut. Ähnlich unsinnig finde ich in Java diese Helper-Klassen, die 
ausschließlich aus static-Methoden bestehen. Da wurde auch prozedurale 
Programmierung in den OOP-Schuh gezwängt. Eine Klasse, die nicht 
instanziiert werden soll und von der auch nicht abgeleitet werden soll, 
ist für mich irgendwie widersinnig.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Rolf Magnus schrieb:
> Eine Klasse, die nicht
> instanziiert werden soll und von der auch nicht abgeleitet werden soll,
> ist für mich irgendwie widersinnig.

Tja, wenn man keine namespaces hat :-)

von Borislav B. (boris_b)


Lesenswert?

Rolf Magnus schrieb:
> Eine Klasse, die nicht
> instanziiert werden soll und von der auch nicht abgeleitet werden soll,
> ist für mich irgendwie widersinnig.

Naah, die sind schon sinnvoll. Wenn eine klasse ausschließlich mit 
statischen Methoden auskommt, muss sie weder instanziierbar noch 
ableitbar sein...

von Mladen G. (mgira)


Lesenswert?

Rolf Magnus schrieb:
> Deshalb finde ich es auch gut, daß C++ OOP nicht fest erzwingt, wie es
> Java tut. Ähnlich unsinnig finde ich in Java diese Helper-Klassen, die
> ausschließlich aus static-Methoden bestehen. Da wurde auch prozedurale
> Programmierung in den OOP-Schuh gezwängt. Eine Klasse, die nicht
> instanziiert werden soll und von der auch nicht abgeleitet werden soll,
> ist für mich irgendwie widersinnig.

Von den meisten Klassen sollte nicht geerbt werden, OOP ist nicht dazu 
da ueberall und alles zu vererben, vor allem nicht nur um Code 
wiederzuverwenden.

Leute verwechseln gerne Vererbung mit "guter" OOP, das Kernkonzept der 
OOP ist immer noch "Daten und Operationen auf diese Daten sollten 
zusammensein".

Vererbung bietet sich an, wenn man gemeinsame Schnnittstellen hat und 
ausdruecken will "Ist ein", Vererbung hat aber eben den Nachteil der 
starken Kopplung, Vererbung zu nutzen nur um Code wiederzuverwenden gilt 
als Missbrauch.

Stimme dir zu was die Helper Klassen betrifft, statische Methoden machen 
das Mocken schwieriger und zB. in Java schliessen sich static Methoden 
und Schnittstellenvererbung aus, fuehrt dann zum sog. "shadowing".

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Ich finde sogar, auch LED-Blinker gehen in OOP:
1
int main () {
2
  pinB13.initialize (OUTPUT);
3
  while (true) {
4
    pinB13.set (1);
5
    delay (1000);
6
    pinB13.set (0);
7
    delay (1000);
8
  }
9
}
Geeignetes API vorrausgesetzt natürlich. Ist dieser Code unnötig komplex 
und lang gegenüber prozeduraler Programmierung? Finde ich nicht.
Hardware-Einheiten wie Pins, USARTS, Timer etc. sind doch in der 
Realität Objekte, warum nicht auch in der Programmiersprache als Objekte 
darstellen?

Rolf Magnus schrieb:
> Deshalb finde ich es auch gut, daß C++ OOP nicht fest erzwingt, wie es
> Java tut.
Keine Sprache kann OOP erzwingen. Wenn in in Java alles in eine Klasse 
schreibe ist das kein OOP (auch wenn da 1x "class" im Code vorkommt). 
Dass Java keine globalen Funktionen&Variablen kann vereinfacht die 
Sprache, und Java ist auf Einfachheit ausgelegt. Und mal ehrlich, so 
schlimm ist es nicht, einmal "class Blubb {" vor die main() zu 
schreiben...

von TriHexagon (Gast)


Lesenswert?

Student schrieb:
> Ich programmiere schon seit ein paar Jahren C und wrüde sagen, dass ich
> auch ganz gut darin bin. Dieses Semeser habe ich eine C-Lehrveransatung
> mit der Höchstunktezahl abgeschlossen

Nach meiner Erfahrung bedeutet das leider nichts. Der Unterricht ist 
meistens eher von schlechter Qualität, ob an den Berufsschulen oder an 
den Hochschulen. Wenn man Glück hat, hat man einen Dozenten der sich 
wirklich auskennt und den Stoff zu vermitteln weiß. Aber das scheint 
eher eine Ausnahme zu sein als die Regel (vor allem bei C++). Unser 
Professor war ein Microsoftjünger, benutze fflush(stdin) und zwang uns 
die ungarische Notation zu benutzen (nach seiner Meinung total 
verbreitet. Nur lustig dass Microsoft keine ungarische Notation mehr 
benutzt seit der WinAPI ;) ). Achso i++ war natürlich auch noch 
schneller als i+=1. Kaum zu glauben, dass er mal in der Wirtschaft tätig 
war.

Klaus Wachtler schrieb:
> Die schlechte Nachricht:
> alles zu C++ lernen = keine Chance, das dauert ewig

Was zum Glück auch nicht sinnvoll ist.

OOP ist wirklich genial und kommt unseren Denken auch sehr viel näher 
als reine prozedurale Programmierung. Man sollte allerdings nicht alles 
in ein Objekt quetschen nur weil es geht, den Fehler sieht man leider 
oft. Java und C# erzwingen das ja quasi (geht sonst nur über statische 
Methoden).

von Paul B. (paul_baumann)


Lesenswert?

TriHexagon schrieb:
> Achso i++ war natürlich auch noch
> schneller als i+=1. Kaum zu glauben, dass er mal in der Wirtschaft tätig
> war.

Als Kellner. Da muß man schnell addieren können.
;-)
MfG Paul

von Rolf Magnus (Gast)


Lesenswert?

Boris P. schrieb:
> Rolf Magnus schrieb:
>> Eine Klasse, die nicht instanziiert werden soll und von der auch nicht
>> abgeleitet werden soll, ist für mich irgendwie widersinnig.
>
> Naah, die sind schon sinnvoll. Wenn eine klasse ausschließlich mit
> statischen Methoden auskommt, muss sie weder instanziierbar noch
> ableitbar sein...

Hast du den Teil davor auch gelesen? Hier ist er nochmal:

Rolf Magnus schrieb:
> Ähnlich unsinnig finde ich in Java diese Helper-Klassen, die
> ausschließlich aus static-Methoden bestehen. Da wurde auch prozedurale
> Programmierung in den OOP-Schuh gezwängt.

Sinnvoll sind sie meines Erachtens nicht, sondern nur eine Notlösung, 
weil Java halt keine freistehenden Funktionen unterstützt, man sie aber 
eigentlich manchmal doch bräuchte.

Mladen G. schrieb:
>> Eine Klasse, die nicht instanziiert werden soll und von der auch nicht
>> abgeleitet werden soll, ist für mich irgendwie widersinnig.
>
> Von den meisten Klassen sollte nicht geerbt werden, OOP ist nicht dazu
> da ueberall und alles zu vererben, vor allem nicht nur um Code
> wiederzuverwenden.

Das hab ich ja auch nicht behauptet. Aber wenn die Klasse weder 
instanziiert, noch von ihr geerbt wird, bleibt gar nichts 
objektorientiertes mehr übrig. Ich habe also einen grundlegenden 
Bestandteil der OOP - die Klasse - verwendet, um damit etwas umzusetzen, 
das mit OOP nichts mehr zu tun hat. Und das ist wie gesagt in meinen 
Augen widersinnig.

> Leute verwechseln gerne Vererbung mit "guter" OOP, das Kernkonzept der
> OOP ist immer noch "Daten und Operationen auf diese Daten sollten
> zusammensein".

Das habe ich ja selbst auch schon geschrieben:

Rolf Magnus schrieb:
> Es ist auch möglich, "zuviel OOP" zu machen und sich in nachher niemals
> notwenigen Klassenhierarchien zu verkünsteln.

von Borislav B. (boris_b)


Lesenswert?

Rolf Magnus schrieb:
> Sinnvoll sind sie meines Erachtens nicht, sondern nur eine Notlösung,
> weil Java halt keine freistehenden Funktionen unterstützt

Doch, so werden die Methoden sauber gruppiert und sind alle in einem 
"Namensraum" (= Name der Klasse) zu finden. Das macht es deutlich 
übersichtlicher, als einzelne Funktionen lose im Quellcode 
herumschwimmen zu haben...

Außerdem benötigen die Funktionen u.U. auch noch Daten, die hier einfach 
als statische Member der Klasse untergebracht werden können. Bei 
freischwebenden Funktionen müsste man daraus dann globale Variablen 
(ugh!) machen...

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Boris P. schrieb:
> Rolf Magnus schrieb:
>> Sinnvoll sind sie meines Erachtens nicht, sondern nur eine Notlösung,
>> weil Java halt keine freistehenden Funktionen unterstützt
>
> Doch, so werden die Methoden sauber gruppiert und sind alle in einem
> "Namensraum" (= Name der Klasse) zu finden. Das macht es deutlich
> übersichtlicher, als einzelne Funktionen lose im Quellcode
> herumschwimmen zu haben...
>
> Außerdem benötigen die Funktionen u.U. auch noch Daten, die hier einfach
> als statische Member der Klasse untergebracht werden können. Bei
> freischwebenden Funktionen müsste man daraus dann globale Variablen
> (ugh!) machen...

Danke dafür, dass Du meine Antwort geschrieben hast. Genau so sollte sie 
aussehen ;-)

Ein Namespace ist schon ganz angenehm, eben weil da die Variablen nicht 
einfach auf der globalen Ebene "rumfliegen".

Grundsätzlich ist OOP wohl intuitiver, allerdings nicht für Leute, die 
durch prozedurale Programmierung schon "verdorben" sind.

Ich habe mich damals auch erst schwer getan, das Konzept zu verstehen. 
Aber danach ist es eigentlich die logische Abbildung von realen 
Problemen.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Student schrieb:
> Bevor ich mich
> dazu anmelde wollte ich mir noch kurz euere Meinungen hohlen, wie
> schwierig ihr es einschätzt C++ noch dazuzulernen.

Schwierig nicht, aber man steht plötzlich vor vielen Fragen der 
SW-Architektur, die man ohne OOP nie gestellt hätte. Das zeigt auch die 
Diskussion, die hier gerade (wieder!) entbrennt.

Nun lasst doch erstmal 'Student (Gast)' zu Wort kommen!

'Diskussionen zum Sebstzweck' haben wir im
Beitrag "C++ auf einem MC, wie geht das?"

Klaus Wachtler schrieb:
> Ab einer gewissen Komplexität hast du aber natürlich recht, aber das ist
> nicht Mobys Welt.

Ach, geht das hier jetzt auch los? ;-) Der arme 'Student (Gast)' wird 
viel Stoff zum Lesen bekommen!

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


Lesenswert?

Boris P. schrieb:
> Doch, so werden die Methoden sauber gruppiert und sind alle in einem
> "Namensraum" (= Name der Klasse) zu finden. Das macht es deutlich
> übersichtlicher, als einzelne Funktionen lose im Quellcode
> herumschwimmen zu haben...
>
> Außerdem benötigen die Funktionen u.U. auch noch Daten, die hier einfach
> als statische Member der Klasse untergebracht werden können. Bei
> freischwebenden Funktionen müsste man daraus dann globale Variablen
> (ugh!) machen...

Chris D. schrieb:
> Danke dafür, dass Du meine Antwort geschrieben hast. Genau so sollte sie
> aussehen ;-)

Ich habe auch erst anfangen wollen, einen änlichen Text zu schreiben, 
aber bei genauerem Überlegen dann auch festgestellt, dass er recht hat.
Die Funktionen/Member würden sich ja ohnehin im Namensraum des Packages 
befinden (im weitesten Sinne das, was bei c++ die Namespaces sind). Sie 
würden also keineswegs wie bei C den globalen Namensraum verschmutzen.

Edit:

Bei C++ ist eine Klasse mit nur statischen Methoden ja quasi äquivalent 
zum einem Namensraum, hat aber den Nachteil, dass man nix "von außen" 
hinzufügen kann.

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

Boris P. schrieb:
> Rolf Magnus schrieb:
>> Sinnvoll sind sie meines Erachtens nicht, sondern nur eine Notlösung,
>> weil Java halt keine freistehenden Funktionen unterstützt
>
> Doch, so werden die Methoden sauber gruppiert und sind alle in einem
> "Namensraum" (= Name der Klasse) zu finden.

Dazu gibt es (zumindset in C++) Namespaces. Man muss dafür nicht extra 
eine ansonsten nutzlose Klasse anlegen.

> Außerdem benötigen die Funktionen u.U. auch noch Daten, die hier einfach
> als statische Member der Klasse untergebracht werden können. Bei
> freischwebenden Funktionen müsste man daraus dann globale Variablen
> (ugh!) machen...

Wo ist denn deiner Meinung nach der große Unterschied zu einer globalen 
Variable?
Ich hab schon häufig gesehen, daß irgendwelche merkwürdigen Verrenkungen 
gemacht werden, um globale Variablen durch was zu ersetzen, das auch 
nicht besser ist, aber offiziell dann nicht mehr als globale Variable 
gilt.
So wie z.B. der Mißbrauch von Singletons, der in dem Zusammenhang auch 
oft begangen wird.

von Marc (Gast)


Lesenswert?

Mladen G. schrieb:
> Leute verwechseln gerne Vererbung mit "guter" OOP, das Kernkonzept der
> OOP ist immer noch "Daten und Operationen auf diese Daten sollten
> zusammensein".

Nein. Da war nie "das Konzept" von OOP.

Eine verbreitete Strömung der OOP-Sprachen hat diesen (einschränkenden) 
Weg gewählt.

Andere OOP-Sprachen trennen Daten und Methoden strikt. Ein Beispiel wäre 
Common Lisp. Gibt noch andere.

von Borislav B. (boris_b)


Lesenswert?

Rolf Magnus schrieb:
> Wo ist denn deiner Meinung nach der große Unterschied zu einer globalen
> Variable?

Dass die Variable nur innerhalb der Klasse sichtbar ist. Somit kann ich 
sicher sein, dass diese nicht von anderen Stellen aus verwendet werden 
kann.

von Vlad T. (vlad_tepesch)


Lesenswert?

Boris P. schrieb:
> Dass die Variable nur innerhalb der Klasse sichtbar ist. Somit kann ich
> sicher sein, dass diese nicht von anderen Stellen aus verwendet werden
> kann.

wenn ich das nicht will, kann ich sie genauso gut statisch im c/cpp file 
definieren und muss sie nicht im Header als extern exportieren.

von Mladen G. (mgira)


Lesenswert?

Marc schrieb:
> Mladen G. schrieb:
>> Leute verwechseln gerne Vererbung mit "guter" OOP, das Kernkonzept der
>> OOP ist immer noch "Daten und Operationen auf diese Daten sollten
>> zusammensein".
>
> Nein. Da war nie "das Konzept" von OOP.
>
> Eine verbreitete Strömung der OOP-Sprachen hat diesen (einschränkenden)
> Weg gewählt.
>
> Andere OOP-Sprachen trennen Daten und Methoden strikt. Ein Beispiel wäre
> Common Lisp. Gibt noch andere.

Falsch. (um mal auf demselben Niveau zu antworten..)

Common Lisp hat auch Elemente von funktionalen Programmiersprachen, und 
dazu gehoert u.a. die Trennung von Daten und Funktionen.

OOP basiert darauf Daten und die Operationen die auf diesen Daten 
arbeiten in Objekte zu kapseln, sollte man eigentlich im OOP 
Grundlagenkurs gelernt haben.

Vererbung, wenn richtig eingesetzt 
(http://en.wikipedia.org/wiki/Liskov_substitution_principle), kommt viel 
seltener zum Einsatz als viele glauben.

von lalala (Gast)


Lesenswert?

Rolf Magnus schrieb:
> OOP
> beschreibt die Sache eigentlich in einer für den Menschen viel
> gewohnteren Art.

Denkt man erst einmal. Stimmt leider nicht. Ist ein Kreis etwa keine 
Ellipse?
http://en.wikipedia.org/wiki/Circle-ellipse_problem

von Marc (Gast)


Lesenswert?

Mladen G. schrieb:
> Falsch. (um mal auf demselben Niveau zu antworten..)

Informier dich doch erstmal.

> Common Lisp hat auch Elemente von funktionalen Programmiersprachen, und
> dazu gehoert u.a. die Trennung von Daten und Funktionen.

Das Common Lisp Object System (CLOS) ist Objektorientierung.

Im übrigen könntest du dich auch mal über generic functions oder auch 
multiple dispatch schlaumachen.

Die Verquickung von Daten und Methoden führt nämlich direkt zu single 
dispatch, nämlich einem ausgezeichneten, "führenden" Objekt beim 
Dispatch: üblicherweise this genannt.

Und daher kommen dann auch Verrenkungen wie friend in C++.

von Borislav B. (boris_b)


Lesenswert?

Vlad Tepesch schrieb:
> wenn ich das nicht will, kann ich sie genauso gut statisch im c/cpp file
> definieren und muss sie nicht im Header als extern exportieren.

Joar, kann man so machen. Wenn man's mag ;-)

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Dr. Sommer schrieb:
> Klaus Wachtler schrieb:
>> Das langwierigste ist sicher, die OO-Denkweise zu verinnerlichen
> Als ob, das ist noch schön einfach und leicht vorstellbar. Warum immer
> alle Angst vor OOP haben verstehe ich nicht.

Man kann schon ganz schön lange über Probleme nachdenken, die man ohne 
OOP gar nicht gehabt hätte. Allein schon das Beispiel 'Ist ein Kreis 
etwa keine Ellipse'^^ zeigt, vor welchen Entscheidungen man hier steht. 
Und bei C++11 wird´s noch schlimmer!

> * Fehlschlagspezifikation für die Größenanpassung
> * Vertauschen der Vererbungsrichtung
> * Verzicht auf eine Spezialisierung
> * Verzicht auf eine Vererbungsbeziehung
> * Erweiterung der Vererbungshierarchie
> * ...

Bücher wurden ja schon empfohlen. Man sollte sich verschiedene Typische 
Patterns anschauen ("Entwurfsmuster" unter Wikipedia), bevor man mit der 
Einstellung "das ist … einfach und leicht vorstellbar"^^ anfängt und 
merkt, dass man auf dem Holzweg war, wenn man eigentlich mit der SW 
schon fertig sein wollte.

Wer kennt das? Wem ist das noch nie passiert?

BTW: Nachdem wir im anderen Thread bereits Peter Dannegger 'verloren' 
haben, hängen wir hier auch gerade den OP 'Student (Gast)' ab. Oder?

@Student: Sag doch mal was!
Konnten wir Dir helfen? Hast Du Dich schon entschieden?

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


Lesenswert?

Torsten C. schrieb:
> Man kann schon ganz schön lange über Probleme nachdenken, die man ohne
> OOP gar nicht gehabt hätte.

die gleichen Probleme stellen sich bei klassischer imperativer 
programmierung aber genauso.

MAn hat ein Haufen komplexer Anforderungen, die nicht trivial zu lösen 
sind und muss irgendwie einkomplexes System Programmieren, dessen 
EInzelteile dennoch ÜBerschaubar sind und das am besten noch mit einer 
Feinen Gui gesteuert werden kann.
Hier hat sich der objektorientierte Ansatz nunmal am besten bewährt.

Während darüer diskutiert wird, welche Entwurfsmuster zur Abbildung am 
besten geeignet sind, stellt sich die Frage in C meistens nicht, weil 
man hier immer noch damit beschäftigt ist die Basisfunktionalität, die 
C++ schon mitbringt zusammenzuschustern und froh ist, wenn die erst msl 
läuft und dann den den Rest aufgrund von Zeitmangel irgendwie 
reinfummelt.

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.