 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Tibor Pausz Guest
|
Posted: Tue Nov 25, 2003 12:57 pm Post subject: Re: Glaubensfrage C / C++ |
|
|
Bodo Thiesen <bothie (AT) gmx (DOT) de> wrote:
Crosspost und Folloup nach dcl.iso-c++, da hier OT.
| Quote: | Wo ist das Objektorientiert? Wo ist die Klasse, wo sind die Daten, wo
sind die Methoden, die darauf operieren.
|
Klasse: std::cout
Operator:
std::ostream& operator<< (std::ostream&, const char*)
Daten: "Hello World!"
Das Problem wird nicht mit Polymorphie sondern mit Überladen des
Operators "operator<<" gelöst. Da es sich hier um einen eingebauten
Typen "const char*" handelt, muß man den passenden Operator nicht selbst
definieren.
| Quote: | Meine Version versuchte wenigstens zu zeigen, worum es geht.
|
Den Versuch darfst Du als gescheitert ansehen. Du blähst Dein Beispiel
auf, wobei nicht zu erkennen ist, was für einem Zweck es dienen soll.
Polymorphie benutzt du nicht und Überladung auch nicht. Der Sinn dieses
Codebeispiels ist nicht zu erkennen. Wozu dieser Overhead?
Es nährt bloß den Verdacht, daß das C Beispiel schön schlank erscheinen
soll und die C++ Version unnötig aufgebläht ist.
Wenn man eine beliebige Klasse myclass hast, willst man möglichst nur
einmal die Ausgabe für viele Ausgabeströme definieren.
#include
#include <fstream>
// Rumpf einer beliebigen Klasse myclass,
// die man beliebig erweitern kann
// damit man sieht wie operator<< funktioniert
// ist ein member a_member vorhanden
class myclass {
friend std::ostream& operator<< (std::ostream& out, const myclass& my);
public:
myclass (int in) : a_member (in) {};
private:
int a_member;
};
// Dieser Operator definiert ein Ausgabeformat für alle ostreams,
// egal ob es sich um std::cout, std::ofstream oder was auch
// immer abgeleitet von der Basisklasse handelt.
std::ostream& operator<< (std::ostream& out, const myclass& my) {
out << my.a_member;
return out;
};
int main () {
myclass a (10);
std::cout << a << std::endl;
std::ofstream file ("myfile");
file << a << std::endl;
return 0;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Kai Ruhnau Guest
|
Posted: Tue Nov 25, 2003 11:54 pm Post subject: Re: Glaubensfrage C / C++ |
|
|
| Quote: | #include <stdio.h
#include
#incldue
/*
* Die Klasse für ein Datenfeld:
*/
class Feld {
/*
* Die folgenden Elemente dürfen nur von der Klasse aus selber
* benutzt werden
*/
private:
/*
* Wie in der C version: Der Zeiger auf das Datenfeld.
*/
int * Datenfeld;
/*
* Da die Klasse die Größe des Feldes übergeben bekommt, muß sie
* sich diese nun auch merken. Auf diese Weise ist es möglich, mit
* dieser Klasse mehrere Datenfelder unterschiedlicher Größe
* anzulegen.
*/
int size;
/*
* Die folgenden Elemente dürfen von überall aus aufgerufen werden.
*/
public:
Feld(int num);
void Ausgeben();
void RandomInit(void);
void Sortieren();
};
/*
* Der sogenannte Konstuktor. Er wird immer dann aufgerufen, wenn ein
* neues Feld erzeugt wird. In diesem Beispiel also an der Stelle, wo
* in der Funktion main »Feld MeinDatenFeld(NUM);« steht.
*/
Feld::Feld(int size) {
/*
* Genauso wie in der C Version müssen wir hier das Datenfeld
* erzeugen. Statt malloc wird hier das OOP-new benutzt. Macht
* hier aber letztlich das gleiche (Speicher belegen).
*/
Datenfeld = new int[size=num];
/* Prüfen, ob wir den Spicherbereich bekommen haben */
if (!Datenfeld) {
perror("new");
exit(2); /* throw wäre hier eigentlich besser */
}
}
/* Die Ausgabefunktion: */
void Feld::Ausgeben(void) {
int i;
for (i=0;i
printf("%i ",Datenfeld[i]);
}
putchar('n');
}
/* Die Funktion, die das Datenfeld mit Zufallsdaten füllt. */
void Feld::RandomInit(void) {
for (i=0;i
Datenfeld[i] = rand();
}
}
/* Die Sortierfunktion: */
void Feld::Sortieren(void) {
int i,j,tmp;
for (j=0;j
for (i=j+1;i
if (Datenfeld[i]>Datenfeld[j]) {
tmp=Datenfeld[i];
Datenfeld[i]=Datenfeld[j];
Datenfeld[j]=tmp;
}
}
}
}
/* Auch hier: Der Konstanten 20 einen Namen verpassen */
#define NUM 20
/* Hier fängt das Hauptprogramm an: */
int main(void) {
/*
* Hier wird das Datenfeld erzeugt. Beachte bitte, daß - so
* unscheinbar diese Zeile auch aussehen mag, hier ein ganzer
* Rattenschwanz an Funktionen aufgerufen werden könnten.
*/
Feld MeinDatenFeld(NUM);
/* Initialisierung des Zufallsgenerators mit der Systemzeit. */
srand(time(NULL));
/* Initialisierung mit Zufallswerten. */
MeinDatenFeld.RandomInit();
/* Und ausgeben, damit wir nachher vergleichen können. */
MeinDatenFeld.Ausgeben();
/* Jetzt wird sortiert: */
MeinDatenFeld.Sortieren();
/* Und zur Kontrolle nochmal ausgeben. */
MeinDatenFeld.Ausgeben();
exit(0);
}
|
Hmm, ich reite der Vollständigkeit mal darauf rum und machs zu C++:
#include <iostream> //cout
#include <iterator> //ostream_iterator
#include <algorithm> //generate
#include <vector> //vector
#include <cstdlib> //rand
using namespace std; //Für so ein kleines Programm ok
int main()
{
//"Feld" mit 10 Elementen
vector<int> MeinDatenFeld(10);
//Mit Zufallswerten füllen
generate(MeinDatenFeld.begin(), MeinDatenFeld.end(),rand);
//Mit Leerzeichen getrennt ausgeben
copy(MeinDatenFeld.begin(), MeinDatenFeld.end(),
ostream_iterator<int>(cout," "));
//Zeilenumbruch
cout<
//Sortieren
sort(MeinDatenFeld.begin(), MeinDatenFeld.end());
//Wieder ausgeben
copy(MeinDatenFeld.begin(), MeinDatenFeld.end(),
ostream_iterator
cout<
//Fertig
return 0;
}
Schlägt meiner Meinung nach in der Expressivität und Kürze die anderen
Varianten locker :)
X'Post und F'up nach de.comp.lang.iso-c++ (wegen OT)
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
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
|
|