Ein spezielles "Hello World!"



  • username214 schrieb:

    Und warum gibt der Destruktor die Aufraumen Meldung bei mir nicht mehr aus - obwohl er es doch eigentlich sollte?

    ich bin mir nicht sicher, aber bist du dir sicher, dass er sie wirklich nicht ausgibt...
    Meine Vermutung ist das du sie lediglich nicht mehr "siehst..
    denn schliesslich wird der d-tor ja erst "beim Verlassen" der main aufgerufen..
    wenn du also nur nen "konsolenfenster" für dieses Programm offen hast, dass sich am Ende schliesst, siehst du es einfach nur nicht.. könntest das testen indem du das Programm von einer Konsole aus startest..
    wie gesagt ist nur nen Gedanke



  • Warum bitte eine globale Variable?

    #include <iostream> 
    
    class Beispiel {
    public:
        Beispiel()
        {
            std::cout << "Initialisierung" << std::endl;
        }
    
        ~Beispiel()
        {
            std::cout << "Aufraumen" << std::endl;
        }
    };
    
    int main()
    {
       Beispiel beispiel;
    
       std::cout << "Hello World!" << std::endl;
    }
    


  • Er darf die main() nicht mehr verändern...

    MfG SideWinder



  • s.o.



  • Ups, lesen müsste man können. Ich ziehe meine letzte Antwort zurück 🕶



  • Wenn der Text im Destruktor nicht ausgegeben wird, so liegt das an einer Sub-Standard Library.
    Sogar VC++ v. 6.0 hatte diesen Fehler bis zur letzten Ausgabe.
    Grüße



  • Das muss mit der globalen Variable ganz und gar nicht gehen, soweit ich weiß.

    Die Reihenfolge der Konstruktion und Destruktion von globalen Objekten ist nicht vorgegeben. Deswegen sollte man cout u.ä. globale Streams nicht in Konstruktoren oder Destruktoren globaler Objekte verwenden.

    AFAIK ist das also kein Fehler des MSVC++6, sondern eine Einschränkung von C++.



  • Halbwissen...



  • It was first concocted by Jerry Schwartz. He used it to
    make sure that cin, cout, and cerr were initialized before use.



  • Hallo,
    die Technik hinter Schwartz- bzw. Nifty-Countern wurde hier im Forum auch schon das ein oder andere mal besprochen.



  • HumeSikkins schrieb:

    Hallo,
    die Technik hinter Schwartz- bzw. Nifty-Countern wurde hier im Forum auch schon das ein oder andere mal besprochen.

    Und muss das jetzt so implementiert werden in der IOStream Library mit den Tricks?



  • jerry s schrieb:

    HumeSikkins schrieb:

    Hallo,
    die Technik hinter Schwartz- bzw. Nifty-Countern wurde hier im Forum auch schon das ein oder andere mal besprochen.

    Und muss das jetzt so implementiert werden in der IOStream Library mit den Tricks?

    Nein. Der Standard schreibt (wenn ich 27.3 richtig interpretiere) nur vor, dass die globalen Stream-Objekt vor main konstruiert werden. Das garantiert aber nicht, dass gloable Objekte die Streams in ihren Ctoren/Dtor benutzen können. Fußnote 265 suggeriert zwar, dass dies möglich sein muss, aber Fußnoten sind nun mal nicht normativ.

    So wie ich das sehe ist das eine QOI-Sache und jede moderne Implementation sollte durch entsprechende Tricks (nicht-portable Alternativen zum Nifty-Counter habe ich in diesem Forum auch schonmal erklärt) dafür sorgen, dass cout/cin und Co frühzeitig erzeugut (und damit nicht vorzeitig zerstört) werden.

    Forcieren kann man das Verhalten, wenn man einfach ein globales ios::Init anlegt. Sprich:

    #include <iostream>
    #include <ostream>
    #include <ios>
    
    static ios::Init forceInit;
    
    class Beispiel {
    public:
        Beispiel()
        {
            std::cout << "Initialisierung" << std::endl;
        }
    
        ~Beispiel()
        {
            std::cout << "Aufraumen" << std::endl;
        }
    };
    Beispiel b;
    int main() {}
    

    Hier ist garantiert, dass Ctor und Dtor von Beispiel in ein gültiges cout-Objekt schreiben.


Anmelden zum Antworten