Was wird hier zurückgegeben?



  • Terminverwalter.h:

    class Termineintrag;
    
    class Terminverwalter
    {
    public:
        Termineintrag& holeTermin(const char* name);
    };
    

    Was für einen Rückgabewert hat denn holeTermin? Verstehe das mit dem & nicht.



  • Die Methode holeTermin liefert eine Referenz auf einen Termineintrag zurück. Da ich in Terminverwalter keine Member sehe, hoffe ich stark, dass der zurückgegebene Wert static ist, denn sonst zeigt die Referenz auf ein nicht mehr existentes Objekt.

    http://tutorial.schornboeck.net/referenzen.htm



  • Entschuldige, habe ein wenig Code unterschlagen:

    class Termineintrag;
    
    class Terminverwalter
    {
    public:
        Termineintrag& HoleOderErzeugeTermin(const char* name);
        // Die Funktion prüft, ob der Termin vorhanden ist, wenn ja,
        // Referenz zurück, wenn nein, erzeugen und Referenz zurück
    };
    
    class Termineintrag
    {
    public:
        modifiziereTermin();
    
    private:
        friend class Terminverwalter;
        Termineintrag(const char* name, Terminplaner* planer);
        Termineintrag();
        virtual ~Termineintrag();
    
        Terminverwalter* terminverwalter;
    };
    

    Für mich ist das deswegen kryptisch, weil ich nicht weiss, wie ich einen Termineintrag erzeugen soll, wenn der Ctor private ist!? Wie müsste denn die Syntax lauten, wenn ich einen Termin erzeugen will?

    Termineintrag& terminverwalter->holeOderErzeugeTermin("Neuer Termin"); // ist das so richtig?
    


  • Wenn der Sinn der Sache ist dass ein Termin nur vom Terminverwalter erzeugt werden kann, muss die Klasse Terminverwalter in Termineintrag noch als friend deklariert werden, da sonst niemand überhaupt einen Termin erzeugen kann (da c'tor private, wie Du schon richtig erkannt hast).

    Um einen einzelnen Termin zu speichern brauchst Du eine Referenz:

    Termineintrag& mein_termin = terminverwalter->holeOderErzeugeTermin("Neuer Termin");
    

    Vorausgesetzt der Terminverwalter erzeugt einen Termin der irgendwo gehalten wird (Vector z.B.):

    Termineintrag& Terminverwalter::holeOderErzeugeTermin(const char *name)
    {
        /* Überprüfung ob vorhanden weggelassen */
        Termineintrag neuerTermin(name, ...);
        terminliste.push_back(neuerTermin);
        return terminliste[terminliste.size()-1];
    }
    


  • NullAhnung schrieb:

    Entschuldige, habe ein wenig Code unterschlagen:

    class Termineintrag
    {
    //...
        friend class Terminverwalter;
    //...
    };
    

    Für mich ist das deswegen kryptisch, weil ich nicht weiss, wie ich einen Termineintrag erzeugen soll, wenn der Ctor private ist!? Wie müsste denn die Syntax lauten, wenn ich einen Termin erzeugen will?

    Das Zauberwort hier heißt "friend" - das sagt dem Compiler, daß der Klasse "Terminverwalter" die ganzen Zugriffsbeschränkungen egal sein können. Das bedeutet, daß der Terminverwalter auch die privaten Elemente von Termineintrag nutzen kann, insbesondere dessen Konstruktor.



  • CStoll schrieb:

    Das Zauberwort hier heißt "friend" - das sagt dem Compiler, daß der Klasse "Terminverwalter" die ganzen Zugriffsbeschränkungen egal sein können. Das bedeutet, daß der Terminverwalter auch die privaten Elemente von Termineintrag nutzen kann, insbesondere dessen Konstruktor.

    Das ist ne wichtige information die mich weiter bringt. Aus welchem Grund steht das die Klassedeklaration alleine oben?

    class Termineintrag; // Wofür steht die Deklaration? Unten ist doch Definition...
    
    class Terminverwalter
    {
        // Klasse Terminverwalter
    };
    
    class Termineintrag
    {
        // Klasse Termineintrag
    };
    


  • Der Compiler arbeitet sich von oben nach unten durch den Quelltext - also muß er bei der Deklaration der Methode "Terminverwalter::holeOderErzeugeTermin()" wissen, daß du eine Klasse namens "Temineintrag" hast. Und genau das besagt die Forward-Deklaration "class Termineintrag;"

    (wie diese Klasse aufgebaut ist, interessiert den Compiler an der Stelle nicht - das benötigt er erst, wenn er die Definition der Methode oder einen konkreten Methodenaufruf anfässt)


Anmelden zum Antworten