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; 
    }
    

Anmelden zum Antworten