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 

Re: Glaubensfrage C / C++

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Tibor Pausz
Guest





PostPosted: Tue Nov 25, 2003 12:57 pm    Post subject: Re: Glaubensfrage C / C++ Reply with quote



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





PostPosted: Tue Nov 25, 2003 11:54 pm    Post subject: Re: Glaubensfrage C / C++ Reply with quote



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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
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.