Konstante Strings in Klassedeklaration definieren



  • Hi

    in meinen Klassen habe ich oft Konstanten (meistens Strings), die ich gerne in der Klasse initialisieren würde (übersichtlicher);

    class Foo {
    private:
       static const std::string foo = "Value";
    
    };
    

    Leider geht das ja so nicht. Geht das dennoch irgendwie in C++?



  • statische member können nur außerhalb der klasse definiert werden



  • Was ist denn der Sinn dieser Konstante? Da Du sie privat deklariert hast, kann sie doch eh keiner verwenden. Warum also überhaupt in der Klassendefinition erwähnen? Du kannst die Deklaration und Definition komplett in Deine CPP-Datei verlagern.

    Und wie ich anderswo schon erwähnt hatte: Für String-Konstanten solltest Du bei char* oder char[] bleiben. Für alles andere nimmst Du std::string.

    Du kannst es so machen:

    // header
    #include <iostream>
    #include <ostream>
    
    class foo {
      static const char message[]; // Deklaration, unvollständiger Typ
    public:
      void operator()() const {
        std::cout << (message+0) << std::endl;
      }
    };
    
    // cpp-Datei
    #include "foo.hpp"
    
    const char foo::message[] = "Dies und das";
    

    oder ganz aus dem Header entfernen:

    // header
    class foo {
    public:
      void operator()() const;
    };
    
    // cpp-Datei
    #include <iostream>
    #include <ostream>
    #include "foo.hpp"
    
    const char message[] = "Dies und das";
    
    void foo::operator()() const {
      std::cout << message << std::endl;
    }
    

    Also: Statische Datenelemente kann man in einer Klassendefinition nur deklarieren. Definieren nur außerhalb.

    Am Rande: Include-Guards nicht vergessen. Die habe ich hier einfach mal weggelassen.



  • Wieso char[]? Mit char* wäre wenigstens der Typ überall bekannt.


  • Mod

    hustbaer schrieb:

    Wieso char[]? Mit char* wäre wenigstens der Typ überall bekannt.

    Ist er doch auch so (soweit notwendig). Ich sehe hier keinen Nachteil bei Verwendung von char[] - potentiell ist das sogar besser, weil ein Verweis auf das Objekt immer unmittelbar auf den String zeigt, und nicht den Umweg über ein zusätzliches Zeigerobjekt gehen muss.
    Zwar ist char[] ein unvollständiger Typ, er transportiert aber nicht weniger Information, als as char* täte.



  • Hm.
    D.h. man kann die (implizite) Array-To-Pointer Konvertierung verwenden, obwohl die Grösse des Arrays noch nicht bekannt ist?
    Spricht natürlich im Prinzip nix dagegen, ich wusste nur nicht dass das erlaubt ist.

    Wobei ja, jetzt wo ich nochmal drüber nachdenke... ist eigentlich logisch.

    Einwand zurückgezogen 🙂


Anmelden zum Antworten