• 14.06.2024, 07:39
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

noid

unregistriert

Class, private und printf =)

Mittwoch, 21. Mai 2003, 10:42

so, in der theorie sollte ja in einer klasse variablen und fkt die im private bereich stehen nicht in nicht-mebmer bzw nichtfriendfkt (zB der mainfkt) zugreifbar sein.

beim erstellen einer klasse namens Point habe ich keine zugriffsfkt definiert.

class Point
{
     double x;
     double y;
public:
     Point(void);
     Point(double a, double b);

     Point& operator+= (Point schieb);
     bool operator== (Point refpkt);
};

soweit die klasse.

in main kam dann ein bekannter auf die idee mit

//....
Point a;
//....
printf("%lf %lf",a,a);
//....

die beiden double werte sich anzushene, ich lachte zuerst, er drückte auf build - und siehe da: beide double werte auf dem bildschirm.

woran liegt das ? was macht der ms compiler falsch ? gcc meckert, aber warum eben der ms nicht ?

also wenn jemand ne idee zum warum hat, posten - ich hab keine

LiquidAcid

unregistriert

Re: Class, private und printf =)

Mittwoch, 21. Mai 2003, 16:23

Ersteinmal generell was zum Aufbau einer Klasse (class). Macht es bitte so, dass du die Bereche explizit deklarierst. Damit meine ich folgendes.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
class generic
{
public:
generic();
~generic();

protected:

private:
long lVar;
};


Sag dem Compiler direkt mit was für Bereichen er es hier zu tun hat (public, protected, private) und verlass dich bitte nicht auf Standards. Wo der GCC nämlich hart durchgreift (hast du ja gesehen), bleibt der MS Compiler weich und erlaubt allen Schwachsinn. Also immer explizit die Bereiche der Klasse auszeichnen.

So, nun zum eigentlichen Problem. Ich denke der Fehler liegt hier bei printf. Jedenfalls interpretiert printf die Klasse Point als double. Da ist gewissermaßen schon Typecasting im Spiel. Das macht der MS-Compiler wohl automatisch (was nicht gut ist), der GCC muss dazu explizit (wieder dieses Wort ;D) gezwungen werden, dass er das tut.

Man kann sich das so vorstellen:
Point im Speicher ist einfach eine Ansammlung seiner Members (das sind die beiden doubles x und y). Die printf Funktion versteht aber nichts davon, wie es Points ausgeben kann. MS Compiler castet automatisch (du hast ja schließlich auch angegeben, dass a als double interpretiert werden soll), der GCC nicht, da er typsicherer operiert.

So, nochmal was grundsätzliches. Der MS-Compiler ist sch.eisse, er ist einfach sch.eisse. Die STL ist absoluter Mist, er hält sich an keinen Standard und wirft Typsicherheit über den Haufen. Haben wir ja gesehen.
Beim MS Compiler kannste auch davon ausgehen, dass eine Mischung aus C-Code (printf ist C) und C++-Code (eine Klasse) zu Problemen führt.

Möglichkeit das irgendwie in den Griff zu bekommen: Die Benutzung der Stream-Operator operator<< und operator>>, um Daten auszugeben. Diese Operatoren sind Teil von C++ und harmonisieren besser mit Klassen, etc.
Du musst deiner Klasse dann solche Operatoren spendieren und entsprechend anpassen, damit die Doubles ausgegeben werden. Ist eigentlich recht leicht und erleichtert die Ausgabe auch erheblich, da man dann die Ausgabe folgendermaßen handeln kann:

Quellcode

1
std::cout << object1 << std::endl << object2 << std::endl;


Wenn object1 und object2 die besagten Operatoren besitzen dann kann man so die Ausgabe handhaben. std::endl steht für einen Zeilenwechsel.

Wenn noch Fragen bestehen, einfach fragen! ;)

cya
liquid

noid

unregistriert

Re: Class, private und printf =)

Mittwoch, 21. Mai 2003, 16:47

das mit dem operator<< sollte ich mir mal merken, aber trotz der tatsache, dass ms mist ist (schon mehr als einmal gemerkt, mit friend fkt hat er auch mehr als nur ein kleines problem) weiss ich auch ;)

was mich jetzt an dem ganzen wundert ist die tatsache, dass printf seltsamerweise nicht immer nur die erst double-var ausgibt, sondern beide abwechselnd. wenn der compiler immernur die erste double-var ausgegeben hätte, dann würde mich der cast nicht so wundern.

ich glaub zum programmieren werde ich mir nun doch endlich noch ein linux aufziehen - bei ms gehen zuviele fehler durch, und zuviele richtige sachen werden zu fehlern ;)

LiquidAcid

unregistriert

Re: Class, private und printf =)

Mittwoch, 21. Mai 2003, 17:32

Zitat von »noid«

das mit dem operator<< sollte ich mir mal merken, aber trotz der tatsache, dass ms mist ist (schon mehr als einmal gemerkt, mit friend fkt hat er auch mehr als nur ein kleines problem) weiss ich auch ;)

Wenn du wirklich in C++ programmieren willst, dann solltest du schon auf das Prinzip umsteigen. Das ist auch wesentlich typsicherer, als printf (was ja alles ausgibt, man muss ihm nur sagen, wie er es interpretieren soll).
operator<< und operator>> kannste auch nachher zum Speichern der Klassen auf dem Datenträger verwenden, ist sehr schön, wenn man mehrere Sachen mit ein und demselben Operator erledigen kann.

Zitat von »noid«

was mich jetzt an dem ganzen wundert ist die tatsache, dass printf seltsamerweise nicht immer nur die erst double-var ausgibt, sondern beide abwechselnd. wenn der compiler immernur die erste double-var ausgegeben hätte, dann würde mich der cast nicht so wundern.

Das ist natürlich sehr merkwürdig. Hast du dir schonmal den ASM-Code angeguckt, oder den MS-Debugger eingesetzt, um zu gucken, wie er denn jetzt genau auf die Klassenelemente zugreift? Ist oftmals die einzige Möglichkeit zu sehen, wie und warum der MS-Compiler etwas so macht, wie er es eben macht.

Zitat von »noid«

ich glaub zum programmieren werde ich mir nun doch endlich noch ein linux aufziehen - bei ms gehen zuviele fehler durch, und zuviele richtige sachen werden zu fehlern ;)

Den GCC gibts es allerdings auch für Win32 (MinGW) und mit ein wenig Arbeit (habe ich gehört), soll man den auch mit dem MS-IDE verbinden können. Ich weiß nicht wie gut das jetzt funktioniert, aber die Oberfläche ist ja ganz passabel, nur der Compiler ist halt mist.
Sonst kannste auch Eclipse CDT oder Bloodshed Dev-C++ einsetzen, sehr gute IDEs für Windows.

cya
liquid

noid

unregistriert

Re: Class, private und printf =)

Mittwoch, 21. Mai 2003, 22:02

bin erst beim umsteigen, bisher hat mir c ausgereicht - allein die tatsache, dass ich keinen c++ compiler für µc gefunden habe, hat mich bisher zurückgehalten.

aber ich test mal die andren ides aus. die sind auch seltsamerweise 20x kleiner als vs ;)