C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Vermengung von C und C++
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Thomas Barth
Guest





PostPosted: Sun Dec 10, 2006 3:24 pm    Post subject: Vermengung von C und C++ Reply with quote



Hallo,
spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur erweitern.

Beispiel unter Unix:

header.h
#include <dirent.h>
#include <cstring>
#include <fstream>
using std::ofstream;
using std::ios;

#include <iostream>
using std::endl;


source.cpp
void Filer::getDirEntries(const char dir[], ofstream &os) {
int numberOfEntries, i;

struct dirent **namelist, **list;

if ((numberOfEntries = scandir(dir, &namelist, 0, alphasort)) > 0) {
for(i = 0, list = namelist; i < numberOfEntries; i++, *list++) {
os << (*list)->d_name << endl;
free (*list);
}
free(namelist);
}
}

Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?

Thomas B
Back to top
Thomas Thiele
Guest





PostPosted: Sun Dec 10, 2006 8:00 pm    Post subject: Re: Vermengung von C und C++ Reply with quote



Thomas Barth schrieb:

Quote:
spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur erweitern.

Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?

Ja. Aber das muss ja nicht das einzig Kriterium sein...
Ich werfe mal nur so Dinge wie Wartbarkeit, Lesbarkeit,
Platformunabhängikeit in den Raum.

Statt malloc und free gibts new und delete die normalerweise ein
bisschen mehr und besser machen.

Auch für alle anderen C-typischen Konstrukte wie Pointer und C-Strings
gibts bessere Alternativen in der STL. Für die C-Cast gibts es
spezialisiertere casts (static_cast, reinterpret_cast, dynamic_cast,
const_cast) die zwar unständlicher aussehen, dafür aber genau das machen
(und das auch prüfen) was man machen will. Es ist mir unverständlich
warum man in JAVA diese C-Casts weiterbenutzt. Inklusive ihrer komischen
Syntax. Denn Klammern um das drumrum was man casten will, ist meines
Erachtens sinnvoller.

Und printf benutzt doch keiner freiwillig seit cout.

In freier Wildbahn begegnet mir oft solcher Code. C, welches in eine
Klasse gepackt wurde und nun als C++ gehandelt wird...
Häßlich, tut nicht not.
Und dazu zählen peinlicherweise auch meine eigenen alten C++-Klassen,
wovon ich kürzlich ein paar ausgegraben habe. Allerdings waren da einige
Dinge notwenig. Wie die Verwendung der C-File-Funktionen (fopen und co),
statt fstream. Weil fstream beim damaligen Compiler (VC++ <6.0) buggy war.
Ich finde es viel schlimmer aus diversen Gründen C-Konstrukte verwenden
zu müssen. (Z.B. die win-api ohne MFC) Oder andere Dinge aus diversen
Bibliotheken.

Man sollte nie vergessen, dass C ursprünglich nie dafür gedacht war,
Anwendungsprogramme zu schreiben. Sondern "nur" dafür beim Entwickeln
von Unix den Assembler zu ersetzen...
Back to top
Thomas Barth
Guest





PostPosted: Mon Dec 11, 2006 3:08 am    Post subject: Re: Vermengung von C und C++ Reply with quote



Thomas Thiele wrote:
Quote:
Thomas Barth schrieb:

spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur erweitern.

Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?

Ja. Aber das muss ja nicht das einzig Kriterium sein...
Ich werfe mal nur so Dinge wie Wartbarkeit, Lesbarkeit,
Platformunabhängikeit in den Raum.


Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist? Bei meinem
Beispiel geht es um die unixspezifische Funktion scandir aus dirent.h.
Da muss sogar free() verwendet werden. Ich habe in sämtlichen
C++-Büchern danach gesucht, wie das Einlesen von Dateien aus
Verzeichnissen funktioniert. In dem Buch "The C++ Standard Library - A
Tutorial and Reference Guide" taucht der Begriff Directory auf den 642
Seiten gar nicht erst auf und in "The C++ Programming Language 3rd Ed"
Bjarne Stroustrup genau fünf mal im Zusammenhang mit include directory.
Ich dachte mir, bevor ich jetzt lange suche, verpacke ich die Funktionen
schön in C++-Klassen und kann die Methoden ja später immer noch anders
implementieren, wenn ich herausgefunden habe, wie es C++ typisch gemacht
wird.

Thomas B
Back to top
Thomas Thiele
Guest





PostPosted: Mon Dec 11, 2006 10:11 am    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Barth schrieb:

Quote:
Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist?

Den Fall habe ich doch schon beschrieben:
"Ich finde es viel schlimmer aus diversen Gründen C-Konstrukte verwenden
zu müssen."

Quote:
Beispiel geht es um die unixspezifische Funktion

Geht halt nicht anders. In einer reinen c++-Umgebung würde ichmir
Wrapper-Klassen bauen. Aber das hast du ja auch vor.

Wo ist das Problem? Wink
Back to top
Andreas Huennebeck
Guest





PostPosted: Mon Dec 11, 2006 2:41 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Barth wrote:

Quote:
Thomas Thiele wrote:
Thomas Barth schrieb:

spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur
erweitern.

Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?

Ja. Aber das muss ja nicht das einzig Kriterium sein...
Ich werfe mal nur so Dinge wie Wartbarkeit, Lesbarkeit,
Platformunabhängikeit in den Raum.


Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist? Bei meinem
Beispiel geht es um die unixspezifische Funktion scandir aus dirent.h.
Da muss sogar free() verwendet werden. Ich habe in sämtlichen
C++-Büchern danach gesucht, wie das Einlesen von Dateien aus
Verzeichnissen funktioniert. In dem Buch "The C++ Standard Library - A
Tutorial and Reference Guide" taucht der Begriff Directory auf den 642
Seiten gar nicht erst auf und in "The C++ Programming Language 3rd Ed"
Bjarne Stroustrup genau fünf mal im Zusammenhang mit include directory.
Ich dachte mir, bevor ich jetzt lange suche, verpacke ich die Funktionen
schön in C++-Klassen und kann die Methoden ja später immer noch anders
implementieren, wenn ich herausgefunden habe, wie es C++ typisch gemacht
wird.

Das ist völlig richtig, aber Du bist garantiert nicht der erste, der scandir in einen
C++ Wrapper packt (auch ich bekenne mich schuldig Wink. Es gibt aber mittlerweile
genügend plattformübergreifende Bibliotheken, die das bereits für Dich (und mich)
erledigt haben: qt, vermutlich boost, ..., einfach mal google anwerfen.

Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc
Back to top
Axel Schwenke
Guest





PostPosted: Mon Dec 11, 2006 3:13 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Thiele <thomas.thiele (AT) gmx (DOT) de> wrote:
Quote:
Thomas Barth schrieb:

spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere
wie in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur
erweitern.

Da spricht (fast) nichts dagegen. Ich sehe es sogar als großen Vorteil
von C++ gegenüber z.B. Java an, daß es mir erlaubt, den für das Problem
angemessenen Mix von OO- und prozeduralem Code zu schreiben.

Quote:
Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?

Wenn du einen Auftraggeber oder ein Team hast, müssen die das natürlich
auch akzeptieren. Aber im Prinzip: ja.

Quote:
Auch für alle anderen C-typischen Konstrukte wie Pointer und C-Strings
gibts bessere Alternativen in der STL.

Über das "besser" kann man hin und wieder streiten.

Quote:
Und printf benutzt doch keiner freiwillig seit cout.

IBTD. Gerade kürzlich habe ich (nach langer Abstinenz) mit der Forma-
tierung bei Verwendung von C++ Streams gekämpft. Konkret ging es um
die Umsetzung des folgenden Codes mit C++ Mitteln:

char c;
FILE *f;
....
if (isprint(c))
fprintf(f, "%c", c);
else
fprintf(f, "\\x%02x", c);

(das ist ein Teil eines Code-Generators, der binäre Strings in C[++]
konforme Stringliterale umsetzen soll)

Quote:
Man sollte nie vergessen, dass C ursprünglich nie dafür gedacht war,
Anwendungsprogramme zu schreiben. Sondern "nur" dafür beim Entwickeln
von Unix den Assembler zu ersetzen...

Woher hast du diese Weisheit? IMNSHO ist die Verwendung von C in keiner
Weise eingeschränkt. Man kann es fast genauso gut für Kernel-Code wie
für GUI-Applikationen verwenden. Gerade das macht es ja so mächtig.


XL
Back to top
Thomas J. Gritzan
Guest





PostPosted: Mon Dec 11, 2006 9:06 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Barth schrieb:
Quote:
Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist?

Dann benutze die C-Funktionen. C++ ist ja keine reine Objektorientierte
Sprache.
Sinnvoll ist es natürlich, platformspezifisches in einer Funktion oder
Klasse zu kapseln.

Quote:
[...] geht es um die unixspezifische Funktion scandir aus dirent.h.
Da muss sogar free() verwendet werden. Ich habe in sämtlichen
C++-Büchern danach gesucht, wie das Einlesen von Dateien aus
Verzeichnissen funktioniert.

Verzeichnisse auflisten geht weder in C noch in C++, denn beide Sprachen
setzen nicht voraus, dass es Verzeichnisse gibt.

Schau dir doch einmal boost filesystem an. Damit müsste das auch gehen.
Boost wäre die typische C++-Lösung die du suchst.

--
Thomas
http://www.netmeister.org/news/learn2quote.html
Back to top
Andre Poenitz
Guest





PostPosted: Tue Dec 12, 2006 3:32 am    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Thiele <thomas.thiele (AT) gmx (DOT) de> wrote:
Quote:
Und printf benutzt doch keiner freiwillig seit cout.

Komisch. Immer wenn ich mehr als eine Sprache habe, brauche
ich eine Art printf-Verschnitt...

Andre'
Back to top
Tibor Pausz
Guest





PostPosted: Wed Dec 13, 2006 3:20 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Barth schrieb:

Quote:
source.cpp
void Filer::getDirEntries(const char dir[], ofstream &os) {
int numberOfEntries, i;

struct dirent **namelist, **list;

if ((numberOfEntries = scandir(dir, &namelist, 0, alphasort)) > 0) {
for(i = 0, list = namelist; i < numberOfEntries; i++, *list++) {
os << (*list)->d_name << endl;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Das kann eine Exception werfen -> Speicherloch.
Quote:
free (*list);
}
free(namelist);
}
}

Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?

Nein, denn der Code ist nicht Exception Safe. Wenn Du einen Wrapper
schreibst, dann sollte dieser den C++ Programmierrichtlinien folgen. Die
weitere Verwendung von namelist und list ist nicht sonderlich gut.
Back to top
Sascha Bohnenkamp
Guest





PostPosted: Thu Dec 14, 2006 4:58 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Quote:
Nein, denn der Code ist nicht Exception Safe.
was sollte in dem C-Code den eine Exception werfen?
Back to top
Andreas Huennebeck
Guest





PostPosted: Fri Dec 15, 2006 1:54 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Sascha Bohnenkamp wrote:

Quote:
Nein, denn der Code ist nicht Exception Safe.
was sollte in dem C-Code den eine Exception werfen?

ofstream::operator<<()

Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc
Back to top
Hubert Schmid
Guest





PostPosted: Fri Dec 15, 2006 3:13 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Sascha Bohnenkamp <bohnenkamp (AT) mevisbreastcare (DOT) de> writes:

Quote:
Nein, denn der Code ist nicht Exception Safe.
was sollte in dem C-Code den eine Exception werfen?

Das Beispiel war nicht in C sondern in C++. In dem Code können
insbesondere die beiden operator<<-Aufrufe eine Ausnahme werfen.

--
Hubert Schmid - http://www.z42.de
Back to top
Markus Wichmann
Guest





PostPosted: Fri Dec 15, 2006 8:47 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Thomas Thiele schrieb:
Quote:

Und printf benutzt doch keiner freiwillig seit cout.


Hm... also, als Pascal-Programmierer muss ich sagen, dass ich vom
direkten write[ln]() zum write[ln](Format()) umgestiegen bin. Es lässt
sich einfacher internationalisieren, wenn ich nur einen String mit
Formatierungszeichen habe, als wenn ich 4 Strings habe, zwischen denen
ich Variablen einfüge.

Back to C.
Für den Fall, dass ich mal etwas nicht zu formatieren habe: Was macht

std::cout << "Hello World!" << std::endl;

besser, als

fputs("Hello World!\n", stdout);

? Ich sage: nichts. (Anm: Ich benutze _immer_ fputs(), wenn ich nix zu
formatieren habe. Aus Prinzip. Weil ich sonst fprintf als Stub nutzen
würde (Formatierungs-Funktionalität implementiert und nicht genutzt).
Und ich benutze immer die Datei-Funktionen, weil ich da nicht /hoffen/
muss, dass der Text auf dem stdout landet.)
Ach, ja, warum gebe ich den String in C++ mit std::endl aus? Weil er
sonst nicht angezeigt wird (wegen Pufferung).
Tschö,
Markus
--
Menschen reden den ganzen Tag Unsinn. Sie gehen zum Kühlschrank, machen
ihn auf und fragen: 'Wo ist die Butter?' Ja, wo wird sie sein? Im Kino?
-- Jürgen von der Lippe
Back to top
Stefan Reuther
Guest





PostPosted: Sat Dec 16, 2006 12:23 am    Post subject: Re: Vermengung von C und C++ Reply with quote

Markus Wichmann wrote:
Quote:
Thomas Thiele schrieb:
Und printf benutzt doch keiner freiwillig seit cout.

Hm... also, als Pascal-Programmierer muss ich sagen, dass ich vom
direkten write[ln]() zum write[ln](Format()) umgestiegen bin. Es lässt
sich einfacher internationalisieren, wenn ich nur einen String mit
Formatierungszeichen habe, als wenn ich 4 Strings habe, zwischen denen
ich Variablen einfüge.

ACK.

Quote:
Back to C.
Für den Fall, dass ich mal etwas nicht zu formatieren habe: Was macht

std::cout << "Hello World!" << std::endl;

besser, als

fputs("Hello World!\n", stdout);

Die Tatsache, dass du recht einfach für std::cout einen anderen Stream
einsetzen kannst: sei es nur ein std::stringstream, sei es ein
LogIntoMyWindowStream, ein NetworkStream oder gar ein GzipStream. Das
ist IMHO ein gewaltiger Unterschied.


Stefan
Back to top
Markus Wichmann
Guest





PostPosted: Sat Dec 16, 2006 10:02 pm    Post subject: Re: Vermengung von C und C++ Reply with quote

Stefan Reuther schrieb:
Quote:
Markus Wichmann schrieb:
Back to C.
Für den Fall, dass ich mal etwas nicht zu formatieren habe: Was macht

std::cout << "Hello World!" << std::endl;

besser, als

fputs("Hello World!\n", stdout);

Die Tatsache, dass du recht einfach für std::cout einen anderen Stream
einsetzen kannst: sei es nur ein std::stringstream, sei es ein
LogIntoMyWindowStream, ein NetworkStream oder gar ein GzipStream. Das
ist IMHO ein gewaltiger Unterschied.



Und was hindert dich daran, statt stdout einen anderen Dateizeiger zu
nehmen? In C++ musst du AFAIK den GzipStream selbst schreiben. Was
spricht eigentlich dagegen, alles in eine Datei zu schreiben, und dann
gzip drüber laufen zu lassen? Und da der Algo frei ist, kannst du auch
noch selbst das laufen übernehmen. Ich sehe da keine zu großen Nachteile.

Quote:
Stefan

Markus
--
Menschen reden den ganzen Tag Unsinn. Sie gehen zum Kühlschrank, machen
ihn auf und fragen: 'Wo ist die Butter?' Ja, wo wird sie sein? Im Kino?
-- Jürgen von der Lippe
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.