Wie erste Instanz markieren



  • Hallo,

    Ich brauche in einer Klasse eine Sonderbehandlung für die 1. Instanz. Ich will da zu ein Flag benutzen:

    class Foo {
    private:
       bool isFirstInstance;
    
    };
    

    Wie mach ich das, dass isFirstInstance nur für die 1. Instanz true ist, für alle weiteren false? 😕


  • Mod

    Mit dem Schlüsselwort static kannst du Variablen haben, die sich auf alle Instanzen einer Klasse beziehen, z.B. so:

    class Foo {
    private:
     static bool isFirstInstance;
    public:
     Foo()
      {
        if (isFirstInstance) // ...
    
        isFirstInstance = false;
      }
    }; 	
    
    bool Foo::isFirstInstance = true;
    


  • @Markierer: Dein Code klappt nicht, weil da immer ALLE Instanzen den selben Wert haben.

    Geht das hier?

    Foo::Foo() {
      static bool isFirstWindow = true;
      if(isFirstWindow) {
    	mIsFirstWindow = true;
    	isFirstWindow = false;
       }
    }
    

    ?



  • Alternativ so hier:

    class Foo
    {
      static std::size_t id;
      std::size_t my_id;
    public:
      Foo() : my_id(id)
      { id++;}
    
      bool isFirstInstance() const
      { return !my_id; }
    };
    
    Foo::id = 0;
    


  • Markierer schrieb:

    Ich brauche in einer Klasse eine Sonderbehandlung für die 1. Instanz.

    Wofür?



  • dot schrieb:

    Markierer schrieb:

    Ich brauche in einer Klasse eine Sonderbehandlung für die 1. Instanz.

    Wofür?

    Gibst du eigentlich auch mal konkrete Tipps oder immer nur Meta Fragen? 🙄

    @bmario: Ich sehe da keinen Vorteil gegenüber meinem Ansatz. Bei dir habe ich in der Klasse einen Member mehr (id), den ich eigentlich gar nicht brauche.


  • Mod

    Markierer schrieb:

    dot schrieb:

    Markierer schrieb:

    Ich brauche in einer Klasse eine Sonderbehandlung für die 1. Instanz.

    Wofür?

    Gibst du eigentlich auch mal konkrete Tipps oder immer nur Meta Fragen? 🙄

    Das ist aber eine sehr gute Frage, du solltest sie beantworten.



  • SeppJ schrieb:

    Markierer schrieb:

    dot schrieb:

    Markierer schrieb:

    Ich brauche in einer Klasse eine Sonderbehandlung für die 1. Instanz.

    Wofür?

    Gibst du eigentlich auch mal konkrete Tipps oder immer nur Meta Fragen? 🙄

    Das ist aber eine sehr gute Frage, du solltest sie beantworten.

    Das 1. Objekt ist eben ein Spezialfall. Hat technische Gründe und tut hier nichts zur Sache. 🙄

    Ist dir aufgefallen, dass dein Ansatz falsch ist SeppJ?


  • Mod

    Markierer schrieb:

    SeppJ schrieb:

    Markierer schrieb:

    dot schrieb:

    Markierer schrieb:

    Ich brauche in einer Klasse eine Sonderbehandlung für die 1. Instanz.

    Wofür?

    Gibst du eigentlich auch mal konkrete Tipps oder immer nur Meta Fragen? 🙄

    Das ist aber eine sehr gute Frage, du solltest sie beantworten.

    Das 1. Objekt ist eben ein Spezialfall. Hat technische Gründe und tut hier nichts zur Sache. 🙄

    Dann behalt das lieber für dich, sonst könnte dir noch jemand helfen.

    Ist dir aufgefallen, dass dein Ansatz falsch ist SeppJ?

    Nein, denn er ist richtig.



  • Markierer schrieb:

    Das 1. Objekt ist eben ein Spezialfall. Hat technische Gründe und tut hier nichts zur Sache. 🙄

    Doch, tut schon was zur Sache. Weil sowas eine recht komische Semantik hat und schnell mal zu mühsamen Fehlern führen kann. Was soll passieren, wenn das Objekt kopiert oder zugewiesen wird? Ist das Erste-Instanz-Flag wirklich Bestandteil des Objektstatus, oder geht es mehr darum, bei der ersten Benutzung etwas zu laden o.Ä.? Dann würde ich nämlich keine nicht-statische Membervariable verwenden.



  • SeppJ schrieb:

    Ist dir aufgefallen, dass dein Ansatz falsch ist SeppJ?

    Nein, denn er ist richtig.

    Nein, er ist Schwachsinn. Ab der 2. Instanz ist das Flag IMMER falsch.

    Was soll immer dieses blöde Meta Gebrabbel hier? Die Gründe liegen hier in eine externen Lib und tun hier einen Scheiß zur Sache.

    Bis jetzt kam genau eine brauchbare Antwort und zwar bmario.

    🙄


  • Mod

    Markierer schrieb:

    SeppJ schrieb:

    Ist dir aufgefallen, dass dein Ansatz falsch ist SeppJ?

    Nein, denn er ist richtig.

    Nein, er ist Schwachsinn. Ab der 2. Instanz ist das Flag IMMER falsch.

    Häh? Du wolltest doch etwas, dass die erste Instanz markiert. Deshalb ist es nur bei der ersten Instanz wahr. Und überdenk mal deinen Ton. Wenn du freiwillige Helfer nur anpöbelst und auf Rückfragen nur noch mehr pöbelst, willst du offensichtlich keine Hilfe und der Thread kann geschlossen werden.



  • Markierer schrieb:

    Gibst du eigentlich auch mal konkrete Tipps oder immer nur Meta Fragen?

    Ja. Allerdings versuch ich mich (soweit es mir möglich ist) auf gute Tips zu beschränken. Und auf deine Frage kann ich mangels Information leider keinen besseren Tip geben als: Du läufst gerade in ein Minenfeld, bleib besser sofort stehen wo du bist und rühr dich nicht vom Fleck, sag uns wo du hinwolltest und wir können dir einen sicheren Weg zeigen.

    Aber gut, wenn du den Sinn von "Metagebrabbel" nicht begreifen willst und zu einer Diskussion über die Sinnhaftigkeit deines Ansatzes nicht bereit bist (am Ende könntest du ja noch was lernen 😮 ) dann sollst du auch einfach nur haben um was du gebeten hast:

    class Foo
    {
    private: 
      static Foo* firstInstance;
    public: 
      Foo() 
      { 
        if (firstInstance == 0)
          firstInstance = this;
      } 
    };
    
    // Foo.cpp
    Foo* Foo::firstInstance = 0;
    

    Viel Spaß noch damit, du wirsts schon auch noch lernen 👍

    💡 Tip: Wenn dir mal fad ist kannst du dir ja anschauen wofür man Klassen in echt so verwendet...



  • Markierer schrieb:

    SeppJ schrieb:

    Ist dir aufgefallen, dass dein Ansatz falsch ist SeppJ?

    Nein, denn er ist richtig.

    Nein, er ist Schwachsinn. Ab der 2. Instanz ist das Flag IMMER falsch.

    👍 Rat mal warum das so sein sollte!



  • Auf das blabla von dot brauch ich ja nicht eingehen. Ist eh nur das übliche "Dein Design ist Kacke. Ich weiß alles besser." Obwohl er NULL Ahnung vom Gesamtproblem hat. Grandios solche Leute.

    inter2k3 schrieb:

    Markierer schrieb:

    SeppJ schrieb:

    Ist dir aufgefallen, dass dein Ansatz falsch ist SeppJ?

    Nein, denn er ist richtig.

    Nein, er ist Schwachsinn. Ab der 2. Instanz ist das Flag IMMER falsch.

    👍 Rat mal warum das so sein sollte!

    Bei EINER statischen Variable für alle Instanzen ist es völlig unmöglich die 1. Instanz zu erkennen. Ergo ist sein Code totaler Müll.

    Ich benutzt jetzt meinen Code mit der lokalen statischen Variable. Danke für Nichts!


Anmelden zum Antworten