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