friend in klasse



  • hi

    ich hab zwei klassen:

    class P
    {
    public:
    friend class M; // Erlaubt den Zugriff von "M" auf "P", richtig?
    //.. bild_von_P bestimmen durch funktionen,etc.
    private:
    char bild_von_P;
    };
    
    class M
    {
    public:
    void any() { std::cout << bild << std::endl; }
    private:
    int bild = bild_von_P; // Wie soll ich das hier machen? 
    };
    

    Nur hab ich keine Ahnung, wie ich der Klasse M erlauben soll, dass sie die Variable von der Klasse P benutzen darf 😞

    Wäre sehr dankbar, für jegliche Unterstützung 😉

    Mfg
    P.s.: die klassennamen und sonstige Namen von Variablen zbsp. gehören eigentlich nicht so, ich hab sie nur durch andere Namen ersetzt, weil ... nicht so wichtig 😃



  • Weder die Klasse M noch P hat irgendwelche Variablen.



  • finix schrieb:

    Weder die Klasse M noch P hat irgendwelche Variablen.

    class P
    {
    public:
    friend class M; // Erlaubt den Zugriff von "M" auf "P", richtig?
    //.. bild_von_P bestimmen durch funktionen,etc.
    private:
    char bild_von_P; // <------------------
    };
    
    class M
    {
    public:
    void any() { std::cout << bild << std::endl; }
    private:
    int bild = bild_von_P; // <------------------
    };
    

    Die Pfeile markieren das was ich meine.
    und das was da drinnen ist, sind variablen, egal ob in einer klasse, funktionen oder sonst was ...

    mfg



  • Das Problem ist, deine Zeile 18 macht mal komplett gar keinen Sinn, deswegen kann man dir schwer irgendwelche Ratschläge geben. Erkläre doch mal was sie eigentlich bewirken soll?



  • finix schrieb:

    Das Problem ist, deine Zeile 18 macht mal komplett gar keinen Sinn, deswegen kann man dir schwer irgendwelche Ratschläge geben. Erkläre doch mal was sie eigentlich bewirken soll?

    ich möchte, dass die Klasse M mithilfe der funktion "any()" den Inhalt der Variable bild_von_P von der Klasse P ausgegeben wird.

    mfg



  • str_m schrieb:

    ich möchte, dass die Klasse M mithilfe der funktion "any()" den Inhalt der Variable bild_von_P von der Klasse P ausgegeben wird.

    Hallo, jemand zu Hause?

    <a href= schrieb:

    finix">
    Weder die Klasse M noch P hat irgendwelche Variablen.



  • finix schrieb:

    str_m schrieb:

    ich möchte, dass die Klasse M mithilfe der funktion "any()" den Inhalt der Variable bild_von_P von der Klasse P ausgegeben wird.

    Hallo, jemand zu Hause?

    <a href= schrieb:

    finix">
    Weder die Klasse M noch P hat irgendwelche Variablen.

    was ist das dann? ( BEI DEN PFEILEN ?!)

    class P 
    { 
    public: 
    friend class M; // Erlaubt den Zugriff von "M" auf "P", richtig? 
    //.. bild_von_P bestimmen durch funktionen,etc. 
    private: 
    char bild_von_P; // <-----------------
    }; 
    
    class M 
    { 
    public: 
    void any() { std::cout << bild << std::endl; } 
    private: 
    int bild = bild_von_P; // <------------------ 
    };
    




  • danke, aber wie kann einen Code schreiben, der aus zwei Klassen besteht, und eine Instanz der ersten Klasse in der zweiten Klasse ausgegeben wird, mithilfe von "friend" ?

    mfg



  • kannst du mir bitte ein Beispiel zeigen, wie das geht?

    mfg



  • str_m schrieb:

    kannst du mir bitte ein Beispiel zeigen, wie das geht?

    mfg

    na ja, du hast wohl eine falsche Vorstellung von klassen und solltest daher etwas Grundlagen lernen -
    Klassen stellen vereinfacht gesagt einfache eine Art Bauplan für Objekte dieser Art dar. Also in deinem Fall sagt die Klasse P aus, dass jedes Objekt, dass man von ihr instanziert ein private-Element bild_von_P vom Typ char hat.

    In Klasse M kannst du natürlich jetzt nicht einfach die Variable aus dem Bauplan "Klasse P" verändern, denn das ist eben nur der Bauplan, sondern du brauchst ein OBjekt vom Typ P, dessen Element du dann verändern kannst.





  • Und hättest du weiter gelesen, hättest du dieses Codesnippet gefunden, woraus du ersehen kannst, dass eine Instanz von nöten ist. Wie gesagt, die Variablen einer Klasse sind - sofern nicht static - nur in deren Instanzen existent, nicht aber in der Klasse selber.

    #include <iostream>
    
    class foo; //Forawrd Deklaration, damit in bar friend class foo deklariert werden kann
    
    class bar
    {
    private:
        friend class foo; //so rum muss das friend deklariert werden  
        int data;
    };
    
    class foo
    {
    public:
        void func() { std::cout << inst.data << std::endl; }
    
    private:
        bar inst; //hier kein fehler mehr
    };
    

  • Mod

    Checker&Murckser schrieb:

    Und hättest du weiter gelesen, hättest du dieses Codesnippet gefunden, woraus du ersehen kannst, dass eine Instanz von nöten ist. Wie gesagt, die Variablen einer Klasse sind - sofern nicht static - nur in deren Instanzen existent, nicht aber in der Klasse selber.

    #include <iostream>
    
    class foo; //Forawrd Deklaration, damit in bar friend class foo deklariert werden kann
    
    class bar
    {
    private:
        friend class foo; //so rum muss das friend deklariert werden  
        int data;
    };
    
    class foo
    {
    public:
        void func() { std::cout << inst.data << std::endl; }
    
    private:
        bar inst; //hier kein fehler mehr
    };
    

    Und hättest du weitergelesen, wäre dir klar geworden, dass es einer Forwarddeklaration nicht bedarf, um einen friend zu deklarieren - die Deklaration von foo vor bar ist hier nicht notwendig (natürlich schadet sie auch nicht). Einer Forwärtsdeklaration eines Templates bedarf es dann, wenn wir eine Spezialisierung eines Templates zum friend machen wollen (weil wir uns nicht auf Spezialisierungen beziehen können, bevor das Primärtemplate deklariert wurde - das hat mit friend im Speziellen nichts zu tun) oder einer Memberfunktion einer anderen Klasse zum friend machen (in diesem Falle muss die andere Klasse bereits deklariert worden sein - auch das ist im Prinzip nichts, was speziell mit friend zu tun hat, in anderen Situationen wie der Deklaration eines Memberpointers ist es genauso). Diese Regeln sind lediglich dann strikter, wenn wir friends einer lokalen Klasse (=eine Klasse, die in einer Funktion lokal definiert wird) deklarieren - das ist aber kein besonders häufiger Fall.



  • danke liebe community!

    ich danke euch für die hilfreichen antworten und entschuldigung wegen dem einem Zeug.

    Gute Nacht 😉

    mfg


Anmelden zum Antworten