Einmal-objekte erzeugen
-
Hi Com,
Ich hab ein wenig mit dem VC++ 6 Compiler gespielt und getestet, ob es möglich währe Einmal-opjekte zu erzäugen, eben durch namenlose Klassen, aber leider wollte der VC++ einfach nicht übersetzten, sobalt ich eine Methode in meiner Klasse deklariert habe.
Mit dem g++ Compiler ist mir das dann doch gelungen, aber beim weiterem Rumspielen ist mir dann doch aufgefallen, das er dashier anstandslos Übersetzt:#include <iostream> class { public: void print(); }mein_einmal_obj; void $_10::print() { printf("Mich gibt es nur einmal!\n"); } int main(int argc, char* argv[]) { $_10 mein_einmal_zu_viel_obj; mein_einmal_obj.print(); mein_einmal_zu_viel_obj.print(); std::cin.get(); return 0; }Ist das ISO C++ bzw überhaupt guter Programmstiel?
Mfg Temeschwarrior
-
schau dich mal nach dem entwurfsmuster "singleton" um...
-
Mein Compiler nimmt deinen Code nicht an, also wirds wohl auch kein ISO C++ sein.
Außerdem wird für die Ausgabe in C++ kein printf() sondern std::cout verwendet.
Wenn du nur eine Instanz einer Klasse haben willst, schreibst du eine Singleton-Klasse:#include <iostream> class Singleton { private: Singleton() {} public: ~Singleton() {} // gibt eine Instanz der Klasse Singleton zurück, // die nur einmal existieren kann, da sie static ist static Singleton& Instance() { static Singleton s; return s; } void print() { std::cout << "Mich gibt es nur einmal!\n"; } }; int main() { Singleton& s = Singleton::Instance(); s.print(); std::cin.get(); return 0; }
-
Thx für die schnelle Antwort bin zufrieden
Mfg Temeschwarrior
-
Ich glaube nicht dass "$_10" korrektes C++ ist...
-
@hustbaer wenn man unter Dev C++ das hier eintippt:
#include <iostream> class { public: void print(); }mein_einmal_obj; int main(int argc, char* argv[]) { mein_einmal_obj.print(); std::cin.get(); return 0; }Kommt bei mir das hier:
[Linker error] undefined reference to `$_10::print()'Nicht wirklich überraschend, wenn man print() nicht definiert hat, aber über das $_10 bin ich auf die Idee gekommen;)
Mfg Temeschwarrior
-
Mag schon sein dass dein Compiler das so frisst, Standard C++ ist es aber nicht (und damit nicht portierbar).
Gib der Klasse einen Namen, dann kannst du den Klassennamen statt $_10 verwenden.
BTW: wenn ich das dem VC2005 zu fressen gebe meldet er z.B. "error LNK2001: unresolved external symbol "public: void __thiscall <unnamed-tag>::print(void)" (?print@<unnamed-tag>@@QAEXXZ)"
-
Wenn du die Methode gleich inline definieren würdest, dann ist das sogar Standard-C++ (wenn auch ungewöhlich):
#include <iostream> class { public: void print() { std::cout << "hallo"; } }mein_einmal_obj; int main(int argc, char* argv[]) { mein_einmal_obj.print(); std::cin.get(); return 0; }