simple frage - statische felder



  • uwerothfeld schrieb:

    nun, bei deiner lösung sieht man, dass UNDEFINED und INITIAL uint's sind. ich will dies nach verbergen, oder irre ich???

    eigentlich sind es in meine listing int s. den typen verbergen? wie soll der compiler dann wissen welchen typen du möchtest?



  • ich habs so probiert:

    class PeerID : public Reference<unsigned int> {
    
            public:
                static const PeerID UNDEFINED_PEER_ID;
                static const PeerID INITIAL_PEER_ID;
    
            };
    
            static const PeerID::INITIAL_PEER_ID = 1;
    

    bzw so:

    class PeerID : public Reference<unsigned int> {};
    
       static const PeerID UNDEFINED_PEER_ID = 0;
       static const PeerID INITIAL_PEER_ID = 1;
    

    mit typen verbergen meine ich, dass man wirklich nur PeerID sieht und halt für setter und getter die funktionen der klasse nehmen muß, statt sagen zu können:

    PeerID a=3;
    

    ich weiß, genau das probiere ich mit den statischen feldern. ich dreh mich im kreis.



  • uwerothfeld schrieb:

    class PeerID : public Reference<unsigned int> {
    
            public:
                static const PeerID UNDEFINED_PEER_ID;
                static const PeerID INITIAL_PEER_ID;
    
            };
    
            static const PeerID::INITIAL_PEER_ID = 1;
    

    bei der definition von statischen membern ausserhalb der klassendefinition brauchst du den specifier static nicht hinschreiben (bzw. darfst du gar nicht). ausserdem hast du vergessen den typen von PeerID::INITIAL_PEER_ID hinzuschreiben.

    uwerothfeld schrieb:

    class PeerID : public Reference<unsigned int> {};
    
       static const PeerID UNDEFINED_PEER_ID = 0;
       static const PeerID INITIAL_PEER_ID = 1;
    

    hier definierst du einfach zwei globale variablen mit dem typen.



  • uwerothfeld schrieb:

    mit typen verbergen meine ich, dass man wirklich nur PeerID sieht und halt für setter und getter die funktionen der klasse nehmen muß, statt sagen zu können:

    PeerID a=3;
    

    ich weiß, genau das probiere ich mit den statischen feldern. ich dreh mich im kreis.

    das dürfte gar nicht gehen ausser du hast für die klasse PeerID händisch einen impliziten konstruktor definiert, der einen in int konvertierbaren typen annimmt. lösung -> diesen ctor entfernen.



  • hallo zusammen,

    erst mal dank für die hilfe 🙂

    wenn ich es so definiere:

    class PeerID : public Reference<unsigned int> {
    
            public:
                const PeerID UNDEFINED_PEER_ID = 0;
    
                const PeerID INITIAL_PEER_ID = 1;
    
            };
    

    Bekomme ich:

    In file included from common/Defines.h:13,
                     from BaseMoversight.h:6,
                     from BaseMoversight.cc:1:
    PeerID.h:26: error: field ‘UNDEFINED_PEER_ID’ has incomplete type
    PeerID.h:28: error: field ‘INITIAL_PEER_ID’ has incomplete type
    

  • Mod

    uwerothfeld schrieb:

    mit typen verbergen meine ich, dass man wirklich nur PeerID sieht und halt für setter und getter die funktionen der klasse nehmen muß, statt sagen zu können:

    PeerID a=3;
    

    ich weiß, genau das probiere ich mit den statischen feldern.

    😕 😕 😕

    Es ist ja sehr lobenswert, dass du dein eigentliches Problem beschreibst (ich denke nicht, dass statische Member hier irgendetwas als Lösung des Problems taugen), aber deine Problembeschreibung ist absolut unverständlich. Schreib nicht so, wie du denkst! Stream of consciousness mag gut sein, um Literaturkritiker zu beeindrucken, aber es taugt nicht für verständliche Fachgespräche.



  • c++ ist kein ratespiel. bitte überleg dir mal was passiert, wenn ein typ sich selbst als nicht-statischen member hat. also: PeerID enthält 2 PeerID s, die enthalten je 2 PeerID s, die enthalten je... und immer so weiter. merkst du was?

    edit: ja ich kann seppj nur zustimmen. es ist mir äusserst schleierhaft was du tun möchtest. bitte beschreibe WAS du tun willst, nicht WIE.



  • hallo zusammen. 🙂

    ja, ich bin heut ein wenig verwirrt. geb es zu. 😉

    also folgendes. ich hatte bisher:

    typedef unsinged int PeerID;
    
    static const PeerID UNDEFINED_PEER_ID = 0;
    ...
    

    von solchen Definitionen hab ich ein paar bisher. Nun will ich diese alle in eine gemeinsame Klasse vereinigen: Reference<A>. A ist dann immer der entsprechende Urtyp des typedefs und kann auch ne Zeit oder ähnliches sein.

    Nun halt die Frage: wie bilde ich die oberen Definitionen auf meine neue Klassen ab. class PeerID: public Reference<unsigned int> geht prima. Bloß wo ich meine UNDEFINED_PEER_ID und INITIAL_PEER_ID hinpacke checke ich nicht.

    Verständlicher???


  • Mod

    Ok, das ist verständlich gewesen 👍 .

    Du bist hier anscheinend der Mehrfachbedeutung von static zum Opfer gefallen. static als Prädikat für eine globale Variable bedeutet ganz was anderes als static als Prädikat für ein Klassenmember.

    Wenn ich das nun richtig verstanden habe, dann suchst du etwas in dieser Art:

    template <typename T> class Reference
    {
    protected:
      T data;
    public:
      Reference(const T& data): data(data) { }
    };
    
    class PeerID : public Reference<unsigned>
    {
    public:
      PeerID(unsigned data): Reference<unsigned>(data) { }
    };
    
    static const PeerID UNDEFINED_PEER_ID = 0;
    static const PeerID INITIAL_PEER_ID = 1;
    

    Ich bin mir nicht sicher, ob dies schon alle deine Anforderungen erfüllt, aber in diese Richtung sollte es gehen.



  • hallo zusammen,

    so bin ich erst mal weiter gekommen. einige probleme bezüglich operatoren habe ich noch, aber das machen wir nach meinen urlaub. 😃 vielen dank für eure hilfe. seid super!

    der uwe


Anmelden zum Antworten