PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C versus C++



tiris
17-01-2004, 15:08
Hi,
also ich bin jetzt mal so ein bißchen von C auf C++ umgestiegen und muss sagen dass mit der OOP Vorteil bei der eigentlichen Programmiererei nicht wirklich einleuchtet. Der Vorteil liegt wohl eher in der Erzeugung von Objekten für graphische Apps oder für Objekte als eine Art Container bei Datenbankzugriffen/Dateizugriffen. Die Dateizugriffe sind dann aber auch schon weniger geeignet.

Ist das wirklich alles was OOP bietet. Ich bin einwenig enttäuscht weil ich mit als IMP-Programmierer eigentlich mehr versprochen habe.

Gruß tiris

anda_skoa
17-01-2004, 15:29
C++ bringt ja nicht nur Klassen.

C++ bringt erhöhte Typsicherheit, Abstraktion, Namesräume, etc.

Durch die Klassen wird auch die Aufrechterhaltung von Invarianten leichter.

Wer C++ wie C mit Klassen benutzt, benutzt C mit Klassen und kein C++.

OOP ist nur eine Möglichkeit die C++ bietet und überall dort Vorteile bringt, wo die Modellierung von Objekten der realen Welt erfolgt.

Ciao,
_

tiris
17-01-2004, 15:50
Aber die Typsicherheit zum Beispiel benutze ich ja nicht aktiv. Die habe ich eben. Der einzige Vorteil den ich aktiv benutzen kann ist demnach der Abstraktions- und Modellierungsfaktor, wenn ich deinen Quote richtig verstanden habe.

gruß tiris

Lin728
17-01-2004, 16:02
Ein einfaches Beispiel aus der "Praxis":

Dein Programm muss beim Start eine Konfigurationsdatei einlesen und auswerten.
In C könntest du dies wie folgt realiesieren, indem du eine Funktion schreibst, die z.B. einen Pointer auf eine Struktur zurückgibt, welche die Daten enthält.
Dieser Funktion musst du wieder einen Haufen Parameter übergeben, oder vieleicht sogar das strukt allocieren...

In C++ machst du einfach ein Object, sagts den Daietnamen, und kannst das Object selbst verwenden um an die Daten zu kommen.
Sobald das Objekt erzeugt wird, leßt es die Daten ein, unst stellt diese mittels get/set zur verfügung.
Die Klasse kannst du ohne die inneren Funktionen oder Abläufe zu kennen, auch in anderen Programmen benutzen.
Weiters vereinfacht es dir den Programmaufbau enorm, da der "Glue-Code" der deine einzelnen Funktionsblöcke (hier im sinne von aufgaben) viel geringer und einheitlich wird.

Ich hab mich auch am Anfang gefragt, für was OOP gut sein soll, außer für Widgets (GUIs).
OOP braucht etwas "Einsickerzeit". Das kommt meistens stückchenweise, z.B. wenn man über ein Stück code stolpert, dass man analysiert und auf neue Ideen zur Verwendung von OOP in eigenen Projekten draufkommt. Am Anfang wirkt der dadurch entstehende Overhead eher nur lästig, aber mit der Zeit gewöhnt man sich ziemlich schnell daran und möchte die Vorzüge nicht mehr missen!

anda_skoa
17-01-2004, 16:30
Original geschrieben von tiris
Aber die Typsicherheit zum Beispiel benutze ich ja nicht aktiv.

Ich finde die automtatischen Vorteile viel wichtiger, weil sie dir Arbeit abnehmen und damit auch die Möglichkeit für Fehler reduzieren.

Beispiele für feine C++ Sachen:
dynamic_cast: erlaubt dir sicherer Casts zu machen.

operator overloading: eine Zuweisung ist eine Zuweisung, zwei komplexe Zahlen können mit der selben Syntax addiert werden wie primitive Datentypen, etc.

standard container: du musst nicht jedesmal das Rad neu erfinden wenn du einen Container brauchst. Durch die Implementation als Template ist der Container trotz seiner Universalität typsicher.

standard alogrithmen: warum soll man übliche Algorithmen jedes mal neu implementieren und dabei jedes mal neue Fehler einbauen.

Zugegeben, die beiden letzten sind keine Features der Sprache C++ sondern der C++ Standard Bibliothek, aber die wird eben erst durch die Sprache C++ in dieser Form ermöglicht.

Ciao,
_

Alex_K
17-01-2004, 18:19
Original geschrieben von ceisserer
Das kommt meistens stückchenweise, z.B. wenn man über ein Stück code stolpert, dass man analysiert und auf neue Ideen zur Verwendung von OOP in eigenen Projekten draufkommt.

das problem ist meiner meinung dass in vielen büchern nur die anwendung von OOP erklärt ist, und nicht theroie dahinter (oder nur wenig).
man sollte ich besser nochmals ein buch besorgen dass sich speziell mit OOP auseinanderesetzt (dass mus gar nicht genau auf eine sprache eingehen), dann dauert das einsickern nicht so lange.

meine erfahrung:
also ich bin student, und habe in den ferien vor diesem semester ein programm in C++/wxWindows geschrieben. dieses semester habe ich eine vorlesung gehabt welche sich _nur_ auf OOP bezieht. nun bin ich soweit dass ich das programm komplett neu schreiben will, denn was ich produziert habe war kein C++ programm sondern ein C programm im C++ style ...

cybercrow
17-01-2004, 21:01
Original geschrieben von ceisserer

In C++ machst du einfach ein Object, sagts den Daietnamen, und kannst das Object selbst verwenden um an die Daten zu kommen.
Sobald das Objekt erzeugt wird, leßt es die Daten ein, unst stellt diese mittels get/set zur verfügung.
Die Klasse kannst du ohne die inneren Funktionen oder Abläufe zu kennen, auch in anderen Programmen benutzen.


und wo ist der Unterschied zu C? Da kann ich doch auch eine Funktion schreiben der ich nur den Dateinamen übergebe und sie dann die Daten einließt, so wie es dein Objekt macht. Dazu noch zwei Funktionen set und get die mir die Daten geben bzw. die Daten schreiben und ich habe im Prinzip das gleiche...


Original geschrieben von anda_skoa
operator overloading: eine Zuweisung ist eine Zuweisung, zwei komplexe Zahlen können mit der selben Syntax addiert werden wie primitive Datentypen, etc.


Darin habe ich irgendwie nie so richtig einen Sinn/Vorteil gesehen. Ich finde es eher verwirrend wenn verschiedene Datentypen mit dem gleichen Operator verbunden werden. Da finde ich z.B. a=matrix_multiplikation(b, c); verständlicher. Hier weiß ich gleich was passiert und das ich den Algorithmus dazu in der Funktion matrix_multiplikation finde.

wraith
17-01-2004, 21:28
Original geschrieben von cybercrow

Darin habe ich irgendwie nie so richtig einen Sinn/Vorteil gesehen. Ich finde es eher verwirrend wenn verschiedene Datentypen mit dem gleichen Operator verbunden werden.

Dann siehst du auch keinn Sinn/Vorteil in Funktionsüberladung? (versch. Datentypen mit 'gleicher' Funktion verbunden)


Da finde ich z.B. a=matrix_multiplikation(b, c); verständlicher.

Ja,vielleicht.Aber was ist damit


a = matrix_mul(matrix_mul(a,matrix_add(b,c)),
matrix_add(d,matrix_mul(e,f)));

In scientific computing ist Operator-Overloading daher ein wichtiges Feature (ja auch Fortran hat Operator-Overloading),und auch einer der Gründe,warum Java in dem Bereich noch hinterherhinkt.



Hier weiß ich gleich was passiert und das ich den Algorithmus dazu in der Funktion matrix_multiplikation finde.
Den entsprechenden Operator finde ich genauso schnell.

Sym
18-01-2004, 01:10
Original geschrieben von wraith
Ja,vielleicht.Aber was ist damit


a = matrix_mul(matrix_mul(a,matrix_add(b,c)),
matrix_add(d,matrix_mul(e,f)));


Was soll daran nicht zu verstehen sein?

Aber Du hast das kürzen vergessen ;)

1=matrix_mult(matrix_add(b,c),matrix_add(d,matrix_ mult(e,f)));


Aber zum Thema:

An Deiner Stelle (Beitragsersteller - scrolle jetzt nicht nach dem nickname - hmm, bei so einem Text wäre scrollen sicher schneller) würde ich mir ein kleines Projekt vorgeben (Ampelschaltung, Kleines Matheprogramm mit Matrizen und Zahlenaddition, etc...) und es einfach mal mit C++ versuchen.

Die Praxis hat mir gezeigt, warum OOP in den meisten Fällen gut ist.

tiris
18-01-2004, 12:00
Das mit dem konkreten Projekt hab ich ja gemacht und mich dann nach den Vorteilen gefragt.
Ich wololte 2 Dateien vergleichen und die Schnittmenge dann in eine neue Datei schreiben. Unter C gings ganz einfach mit streams die ich laufen lasse und dann bei Übereinstimmung schreibe.
Aber mit einer Klasse hab ich mir da die Finger wund getippt und es hat trotzdem nicht funktioniert.



gruß tiris

wraith
18-01-2004, 13:05
Original geschrieben von tiris

Aber mit einer Klasse hab ich mir da die Finger wund getippt und es hat trotzdem nicht funktioniert.

Tja,da hast du nur ein perfektes Bsp gebracht,wie man C++ nicht anwenden sollte.
Es geht nicht darum,bei der OOP,und C++ speziell,alles in Klassen zu packen.

K.A wie dein C Code aussieht,aber in C++ würde ich es so machen


//Reihe Includes
int main(int args,char *argv[])
{
ifstream fileIn1(argv[1]);
ifstream fileIn2(argv[2]);
ofstream fileOut(argv[3]);

set_intersection((istreambuf_iterator<char>(fileIn1)),istreambuf_iterator<char>(),
(istreambuf_iterator<char>(fileIn2)),istreambuf_iterator<char>(),
ostream_iterator<char>(fileOut));

}

tiris
18-01-2004, 13:59
Ok,öffnen mit fopen() und fgetc über eine while-SChleife laufen lassen in C dauert länger.

Ich denke das mit der Einwirkzeit könnte stimmen...


gruß tiris

peschmae
18-01-2004, 14:49
Original geschrieben von wraith
Tja,da hast du nur ein perfektes Bsp gebracht,wie man C++ nicht anwenden sollte.
Es geht nicht darum,bei der OOP,und C++ speziell,alles in Klassen zu packen.


Bei Java schon - aber auch dort kannst du alles in main() schreiben - zu OOP zwingt dich keiner.

Das sollst du nur dort benutzen wo es etwas bringt. Herauszufinden wo und wie das am meisten bringt ist dann wohl die grosse Schwierigkeit.

MfG Peschmä

anda_skoa
18-01-2004, 15:09
Original geschrieben von tiris
Ok,öffnen mit fopen() und fgetc über eine while-SChleife laufen lassen in C dauert länger.

Ich denke das mit der Einwirkzeit könnte stimmen...


Bis du sowas wie wraith(wledge?) aus dem Ärmel schütteln kannst, dauert es ziemlich lange.

Dieser funktionale Ansatzt ist ziemliche "advanced"!

Ciao,
_

peschmae
18-01-2004, 15:39
Original geschrieben von anda_skoa
Bis du sowas wie wraith(wledge?) aus dem Ärmel schütteln kannst, dauert es ziemlich lange.

Dieser funktionale Ansatzt ist ziemliche "advanced"!


Dann bin ich ja beruhigt. :D

Lassen wir das ein bisschen "Einwirken"... :cool:

MfG Peschmä

felix_do
18-01-2004, 18:29
Ich, der von Anfang an OOP mit Java gelernt hat, und dann C++ lernen wollte/lerne, musste/muss mich natuerlich auch etwas mit C beschaeftigen. In jedem C++ Buch wird zumindest etwas ueber die C Untermenge von C++ erklaert. Am besten ist in dieser Hinsicht meiner meinung nach das Buch von Bruce Eckel "Thinking ic C++" das einige von euch sicher kennen. Denen die es nicht kennen ist es wohl zum Lernen von C++ empfohlen (das Buch online erhältlich unter www.bruceeckel.com). Sowohl Eckel als auch die einführenden Kapitel von Stroustroups Standardwerk "Die C++ Programmiersprache" legen deutliche Vergleiche zwischen dem was mit C machbar ist und der OOP am Beispiel der Implementierung eines Stacks dar: OOP bringt offensichtliche Vorteile.
Ausserden ist man ja nicht gezwungen nur weil man C++ programmiert auch objektorientiert zu Hacken. Lest Stroustroup und laßt euch segnen. :)

Alex_K
18-01-2004, 18:48
also meiner meinung kann man die vorteile von OOP nicht an kleinen aufgaben oder algorithmen zeigen, weil es da nur wenige bis keine gibt.
wenn man nur mal schnell ein kleines programm schreiben oder algorithmus implementieren will ist es sehr wahrscheinlich dass es mit einer prozeduralen sprache schneller und einfacher geht als mit OOP.

OOP spielt seine vorteile bei größeren projekten aus, wo dann code-wiederverwendung und wartbarkeit eine rolle spielen.

ich kann mal das (recht umfangreiche) skript aus einer vorlesung empfehlen:
http://www.complang.tuwien.ac.at/franz/objektorientiert/skript03.pdf

anda_skoa
18-01-2004, 20:34
Original geschrieben von Alex_K
also meiner meinung kann man die vorteile von OOP nicht an kleinen aufgaben oder algorithmen zeigen, weil es da nur wenige bis keine gibt.


Wie felix_do schon geschrieben hat, sind Datenstrukturen ein Fall, wo man OOP schön sieht.
Klasse sind ansich abstrakte Datentypen.

Am beliebsten ist da der Stack.
Ein der berühmten Informatiker (ich glaube Knuth) hat mal gesagt
"OOP is about implementing stacks"
:D

Ciao,
_