Es ist nicht möglich const Member einer Klasse zu deklarieren die nicht statisch sind ??



  • class foo {
    public:
      enum bar { foobar,
                 bafoo,
                 barfuss,
                 barbus
               };
    
    };
    

    Stefan.



  • 🙂
    Also ich bräcute was in der Rictung:

    class A
    {
    private:
         char const *const B[3];
    public:
    A:B[0](::new const char[102]),B[1](...u.s.w
    

    Das geht bei mir irgendwie schief



  • A:B[0](::new const char[102]),B[1](...u.s.w
    

    Die ganze Syntax sieht irgendwie furchtbar aus...

    Wenn du da was initialisieren willst dann eher so:

    A() : { was was mit B }
    

    dann ist B aber nicht mehr const, schützen könntest kannst du B mit gettern und settern und B private.
    Oder du nimmst den Vorschlag von DStefan

    enum bar {   
                 foobar=102,
                 bafoo=23,
                 barfuss=255,
                 barbus=3
               };
    

    EDIT: habs gerade gesehen du willst ja ein 2-dimensionales Array... dann geht das mit dem enum natürlich nicht.



  • AlexXXx schrieb:

    🙂
    Also ich bräcute was in der Rictung:

    class A
    {
    private:
         char const *const B[3];
    public:
    A:B[0](::new const char[102]),B[1](...u.s.w
    

    Das geht bei mir irgendwie schief

    Ich verstehe nicht, wofür du das brauchst. Warum geht nicht:

    class A
    {
    public:
       A() {
          // B initialisieren
       }
    
    private:
       char *B[3];
    
    };
    

    Wobei es sich in deinem Beispiel ja nicht um eine Klassenvariable handelt. Hast du dich vertippt oder habe ich deine Frage nicht verstanden?

    Stefan.



  • Rohe Arrays sind sowieso mühsam und gefährlich. Du könntest beispielsweise einen Wrapper wie std::tr1::array nehmen und dessen Objekt mit dem Rückgabewert einer Funktion initialisieren. So bleibt die const -Qualifizierung trotzdem erhalten.



  • @Nexus
    Deine Idee hört sich gut an, aber ich verstehe sie nicht.

    -Heut morgen würde ich am Anfang das const Array mit Null und dem Basisinitialisierer initialisieren.
    -Dann im Konstruktor ein Pointer auf den Mit Null initialisierten pointer setzen
    der nicht const ist. (Meine Der Wert auf den er zeigt ist veränderbar)
    -Und dann über diesen pointer den const pointer initialisieren.

    Gruß



  • AlexXXx schrieb:

    -Heut morgen würde ich am Anfang das const Array mit Null und dem Basisinitialisierer initialisieren.
    -Dann im Konstruktor ein Pointer auf den Mit Null initialisierten pointer setzen
    der nicht const ist. (Meine Der Wert auf den er zeigt ist veränderbar)
    -Und dann über diesen pointer den const pointer initialisieren.

    Sorry, vielleicht beschreibst du einfach mal ohne Code dein Problem. Und zwar nicht das wie, sondern das was! Deine vorgehensweise scheint arg kompliziert zu sein. Welche Klasse moechtest du haben, welche Aufgabe soll sie erfuellen und welche Eigenschaften muss sie haben? Btw. was ist mit heute abend oder morgen? 🙂



  • Ich benötige einfach ein Array von pointern. Das Muß 3 groß sein.
    Also char *arr[3] iat genau so okay wie eben char **arr.
    dieses arr würde ich jetzt gerne mit Weiteren Arrays füllen, die dann buffer heißen:
    Also
    arr[0][0]->Zugriff auf das erste byte des erste Buffers
    arr[1][0]->Zugriff auf das erste byte des zweiten Buffers
    arr[2][0]->Zugriff auf das erste byte des dritten Buffers
    Das ganze ist jetzt kein Problem, aber ich hätte gerne, dass diese nicht verändert werden können. Also const.
    Gruß



  • Aorry.
    Also die daten im Buffer sollen les und schreibbar sein, Aber
    die pointer sollte man nicht überschreiben dürfen.
    Gruß



  • Das ist nicht viel besser bzgl "Und zwar nicht das wie, sondern das was!".

    Ein Versuch einer Analogie:
    Du sagst, Du willst mit einem Fahrrad durch die Schillerstraße fahren.
    Wir wollen aber wissen, "wohin" Du willst. Eventuell musst Du gar nicht durch die Schillerstraße um zum Ziel zu kommen. Wir kennen vielleicht eine Abkürzung. Vielleicht gibt es auch eine nette Busstrecke, die Du nicht kennst aber gebrauchen kannst, weil Dein Fahrrad einen Platten hat. 🙂

    Ich sehe zB keinen Grund darin, das Array al1s const zu definieren. Du könntest die Objektelemente als privat deklarieren und Lesezugriff über öffentliche Funktionen anbieten. Ich weiß aber immer noch nicht genau, "wohin" Du eigentlich willst.

    Gruß,
    SP



  • AlexXXx schrieb:

    Ich benötige einfach ein Array von pointern. Das Muß 3 groß sein.
    Also char *arr[3] iat genau so okay wie eben char **arr.
    dieses arr würde ich jetzt gerne mit Weiteren Arrays füllen, die dann buffer heißen:
    Also
    arr[0][0]->Zugriff auf das erste byte des erste Buffers
    arr[1][0]->Zugriff auf das erste byte des zweiten Buffers
    arr[2][0]->Zugriff auf das erste byte des dritten Buffers
    Das ganze ist jetzt kein Problem, aber ich hätte gerne, dass diese nicht verändert werden können. Also const.
    Gruß

    Container wären vielleicht besser:

    #include <vector>
    #include <tr1/array>
    typedef std::vector<char> buffer_type;
    typedef std::tr1::array<buffer_type, 3> buffer_buffer_type;
    
    buffer_buffer_type buffer;
    //...
    


  • @Sebastian
    =)Das habe ich schon herausgehört. Aber es ist mir zu kompliziert jetzt die zusammenhänge zu erklären. Grundsatzdiskussionen sind gerade zu langwierig. Des weiteren kommt meißt was dabei raus, was garnicht so funktioniert wie ich es gerne hätte. Ich benötige das, was ich beschrieben habe.

    @Tachyon
    Das geht leider nicht. Des weiteren müßte ich dann den Allocator überschreiben.
    Gruß



  • AlexXXx schrieb:

    @Tachyon
    Das geht leider nicht. Des weiteren müßte ich dann den Allocator überschreiben.
    Gruß

    Äh WAS? Allokator überschreiben?
    Vielleicht erklärst Du uns mal, was Der Code genau machen soll und nicht, wie Du versuchst es zu codieren.



  • @Sebastian
    Sorry habe deine Antwort nciht genau genug gelesen.
    Private wird das Array so oder so werden. Weiß gerade nicht was es ist, aber
    ich werde es in keinen Fall public machen.
    Ich möchte aber nicht den Anwender meiner klasse davor bewahren auf mein array zu zu greifen, sonder mich, solange ich Methoden der klasse schreibe, welche auf diese Array zugreifen.
    Und das soll bitte der compiler machen, damit ich nicht so viel debuggen muß.
    Es geht auch ohne. Aber es ist schöner wenn mir der kompiler sagt, Alex du hast den Zugriff verplant. Drink einen kaffee!!!!
    Gruß
    P.s.: Ich hätte gerne eine Abkürtzung mit Blümchen und nem See an der seite 🙂
    (Nicht ernst gemeint aber wenn du schon so Bildhaft schreibst komm ich ins träumen sebastian)



  • AlexXXx schrieb:

    Das habe ich schon herausgehört. Aber es ist mir zu kompliziert jetzt die zusammenhänge zu erklären. Grundsatzdiskussionen sind gerade zu langwierig. Des weiteren kommt meißt was dabei raus, was garnicht so funktioniert wie ich es gerne hätte. Ich benötige das, was ich beschrieben habe.

    Na, dann sieh mal zu, wie du es allein herausfindet. Mit jedenfalls ist es viel zu kompliziert, deinen Gedankengängen zu folgen.

    Stefan.



  • Laut Breymann:

    Klassenspezifische Variablen müssen außerhalb der Klassendefinition definiert und initialisiert werden. Dies gilt nicht für klassenspezifische Konstanten, für die der Compiler keinen Platz anlegen muß, weil er direkt ihren Wert einsetzten kann. In C++ ist die Ausnahme jedoch auf integrale und Aufzählungstypen beschränkt

    Damit gibt es (lt.Breymann) ist keine Möglichkeit ein konstantes Klassenspezifisches Array zu konstruieren.



  • @DStefan
    Sorry. Ist blöd ausgedrückt. Danke dir für Hilfe bis dahin
    Gruß



  • @DeepCopy
    Klassenspezifisch meint nicht static ??
    Also eine Variable mit welcher man z.B. die Instanzen (nicht STL Sinn)
    einer Klasse zählen würde.
    Ich brächte eine Membervariable die const ist.
    Gruß



  • AlexXXx schrieb:

    @DeepCopy
    Klassenspezifisch meint nicht static ??

    Doch, static ist das was hier als "Klassenspezifisch" (im Gegensatz zu Objektspezifisch) bezeichniet wird.

    Ich brächte eine Membervariable die const ist.

    Ein normales Member? also ein Array pro Objekt oder eins für alle Objekte zusammen? Auch wenn es für dich noch so umständlich ist, versuch bitte zu beschreiben was du erreichen willst. Genau so wie du es machen wolltest gehts ja offenbar nicht, das hast du (bzw. dein Compiler) ja schon selber herausgefunden. Wir können dir aber nur Alternativen vorschlagen wenn wir wissen, was du erreichen willst, um eben herauszufinden ob die Alternativen auch das tun was du brauchst.

    AlexXXx schrieb:

    Grundsatzdiskussionen sind gerade zu langwierig. Des weiteren kommt meißt was dabei raus, was garnicht so funktioniert wie ich es gerne hätte.

    Genau in so einer Grundsatzdiskussion stecken wir gerade, weil du ein Geheimnis aus deinen Zielen machst und uns nicht verrätst wie du es denn gern hättest. (Sondern nur was du gerne hättest, und das gibts nicht, zumindest nicht in C++)



  • Dazu Breymann

    Auch wenn das Schlüsselwort static fehlt, sind sie für alle Objekte einer Klasse gleich, also klassen- und nicht objektspezifisch

    Damit gibt es keine konstanten Klassen-Elemente (Member) - eins für jedes Objekt.


Anmelden zum Antworten