Ist es möglich komplexen Datentypen 0 zuzuweisen?



  • Hallo allerseits,

    das nächste anscheinend unlösbare Problem plagt mich 😞

    Ich möchte in einer Klasse einen komplexen Datentypen (als Attribut) mit 0 initialiseren, um bei einer Funktion überprüfen zu können, ob schon Werte vom Benutzer eingegeben wurden.

    Sprich in so etwa schaut mein Konstrukt aus:

    Header-Datei:

    #include "Ressource.h"
    class Speicher {
    private:
    Ressource m_res;
    
    public:
    Speicher();
    Ressource getRessource();
    void setRessource(Ressource res);
    }
    

    Impl. (fkt. nicht):

    #include...
    Speicher::Speicher() {
    m_res=0;          
    }
    
    void Speicher::setRessource(Ressource res) {
    m_res=res;
    }
    
    Ressource Speicher::getRessource() {
    if(m_res==0) {
    throw "...";
    }
    return m_res;
    }
    

    Eine zweite Frage hätte ich auch noch:
    Wie könnte man das so realisieren, dass m_res eine Ressource bei setRessource(..) referenziert (sprich m_res ist dasselbe Objekt wie res)? Wie das mit lokalen Variablen geht, weiß ich, aber mit dem Attribut will es nicht so recht klappen.

    Hab's mit:

    Ressource m_res;
    ...
    void Speicher::setRessource(Ressource& res) {
    m_res=res;
    }
    

    mit:

    Ressource& m_res;
    ...
    void Speicher::setRessource(Ressource res) {
    m_res=res;
    }
    

    und mit:

    Ressource& m_res;
    ...
    void Speicher::setRessource(Ressource& res) {
    m_res=res;
    }
    

    versucht, geht aber alles nicht.

    Im Voraus besten Dank 🙂 .

    lg



  • Wenn du dir die bool-Variable "has_entered_data" sparen willst (würde mein Weg sein), dann musst du wohl auf Zeiger umsteigen.

    MfG SideWinder



  • Bzw. wenn du bereits Boost-Benutzer bist schau dir mal boost::optional an.

    MfG SideWinder



  • 1. Du kannst natürlich nicht einfach irgend welchen Objekten 0 zuweisen, wenn das Interface das nicht anbietet? Wie stellst du dir das vor?

    Wenn du dir also merken willst, ob du das Objekt schon richtig initialisiert hast etc. musst du eine zusätzliche Variable benutzen (zB bool is_initialized)

    2. Dann muss m_res natürlich auch ein Pointer oder eine Referenz sein. Ansonsten machst du eben eine normale Zuweisung.

    Schau dir noch mal das Konzept von Referenzen oder Pointern in C++ an und was der Unterschied zwischen

    A a0;
    A &a1;
    A *a2;
    

    ist

    btw. für komplexe Datentypen nimmt man bei Parametern idr. konstante-Referenzen, da dies das kopieren verhindert (darauf wirst du aber stoßen, wenn du dich mit dem Thema Referenzen noch einmal außeinander setzt)

    btw. du solltest dir mal Effektiv C++ oder GotW angucken. Das könnte dir weiterhelfen



  • thx, war aber meinerseits ein ganz blöder Fehler. Hatte vergessen, der Funktion in der Implementierung den richtigen Header zuzuweisen, worauf der Compiler (natürlich) den Namen nicht erkannt hatte. War also kein Fehler mit der Referenz. Naja, das hat man davon, wenn man Funktionsnamen direkt vom Header kopiert. 😉


Anmelden zum Antworten