friend problem :(



  • hi
    hab nen friend problem:

    class a
    {
    private: 
    // bla bla
    public:
    friend class xxx = b; // HIER der Fehler
    // bla bla
    };
    
    class b
    {
    // bla bla
    };
    
    error C2059: Syntaxfehler: '='
    error C2238: Unerwartete(s) Token vor ';'
    

    😞

    Wie kann ich das richtig schreiben, damit ich sachen aus der klasse "b" benutzen kann(zbsp. int x) usw..?

    thx im voraus 😉



  • ohne xxx =



  • Zur Erläuterung: friend "befreundet" Klassen oder Funktionen aber keine Objekte.

    Gruß,

    Simon2.



  • ok very much thx 😉

    doch hab noch ein problem-> wenn ich

    class a
    {
    private: 
    // bla bla
    public:
    friend class b;
    // bla bla
    void test() { cout << b.ZZZZZZZ; } //ich will die variable von class b ausgeben
    };
    
    class b
    {
    public:
    char ZZZZZZZ; // hat nen wert 
    // bla bla
    };
    

    mach,dann geht das natürlich wieder nicht. ich möchte es allerdings ausgeben 😉

    lg



  • Ehm eine public Variable kann jeder nutzen(wie public schon sagt ...)
    Du solltest evt. mal in a eine Instanz von b erzeugen -.-



  • (D)Evil schrieb:

    Ehm eine public Variable kann jeder nutzen(wie public schon sagt ...)
    Du solltest evt. mal in a eine Instanz von b erzeugen -.-

    ja, sry wollte private nutzen, hab mich verschrieben, sry 😞

    class a
    {
    private: 
    // bla bla
    public:
    friend class b;
    // bla bla
    void test() { cout << b.ZZZZZZZ; } //ich will die variable von class b ausgeben
    };
    
    class b
    {
    public:
    // bla
    private:
    char ZZZZZZZ; // hat nen wert 
    // bla bla
    };
    

    So ich möchte den Wert in der klasse a von b.ZZZZZZZ ausgeben, aber wie geht das mit der friend class und instanz(dein vorschlag)?
    bitte code 😉

    LG



  • class bar
    {
    private:
        int data;
    };
    
    class foo
    {
    public:
    friend class bar;
        void func() { std::cout << inst.data << std::endl; } 
    
    private:
        bar inst;
    };
    

    ? Nee ... da kann doch was nicht 😃 Ich weiß auch was ... aber naja find es heraus 😉



  • class bar
    {
    private:
        int data;
    };
    
    class foo
    {
    public:
    friend class bar;
        void func() { std::cout << inst.data << std::endl; } 
    
    private:
        bar inst; //hier fehler
    };
    

    aber kannst du mir pls die lösung posten?

    lg



  • #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
    };
    

    Du musst die friend-Deklarationen vertauschen. Das liegt daran, dass die Klasse selber bestimmen kann/können soll, wer auf ihre Daten zugreifen kann/ihr Freund ist.

    Felix



  • Ey 😞 Der sollte das rausfinden 😉



  • ich habs doch die ganze zeit richtig gehabt, nur war das problem, dass ich die Klassen andersrum geschrieben hab 😃

    geht das?



  • Offensichtlich geht es nur so rum, wie ich es gepostet habe.

    @(D)evil: Sorry 😞

    Felix


  • Mod

    @Phoemuex: Einer Forward-Deklaration von foo bedarf es nicht.



  • Phoemuex schrieb:

    #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
    };
    

    funzt nicht:

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    

    bei

    // bar.h
    class bar 
    { 
    private:
        friend class foo; 
    }; 
    
    // foo.h
    class foo 
    { 
    public: 
    
    private: 
        bar inst;
    };
    

    liebe grüße



  • hi

    ich habs noch immer nicht lösen können, was könnte die Ursache für die Fehlermeldung sein?

    Die Klassen sind in mehrere Dateien aufgeteilt:

    // Klasse FOO:
    
    // foo.h
    
    class bar
    {
    public:
    // funktionen ..
    void set(int);
    private:
    friend class bar;
    int any;
    };
    
    //foo.cpp
    
    #include "foo.h"
    #include < ALLE ANDEREN >
    
    void foo::set(int some)
    {
       any = some;
    }
    
    // Klasse BAR:
    
    // bar.h
    
    class bar
    {
    public:
    void ausgabe();
    private:
    foo inst;
    };
    
    //bar.cpp
    
    #include "bar.h"
    #include < ALLE ANDEREN >
    
    void bar::ausgabe() 
    { 
    std::cout << inst.any << std::endl; 
    }
    
    // MAIN.CPP:
    
    #include "bar.h"
    #include "foo.h"
    #include <ALLE ANDEREN, zbsp. iostream,..>
    
    int main()
    {
    foo haha;
    haha.set(10);
    
    bar test;
    test.ausgabe();
    
    return 0;
    }
    

    und Fehler ist:

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    ich hoffe, ihr könnt mir bitte helfen 😉

    Mfg



  • hab auch versucht vorher foo zu deklarieren, klappt aber immer noch nicht.

    kann mir jemand bitte helfen? 😉



  • Sorry ich hab mich verschrieben, so gehört es richtig:

    // Klasse FOO:
    
    // foo.h
    
    class foo
    {
    public:
    // funktionen ..
    void set(int);
    private:
    friend class bar;
    int any;
    };
    
    //foo.cpp
    
    #include "foo.h"
    #include < ALLE ANDEREN >
    
    void foo::set(int some)
    {
       any = some;
    }
    
    // Klasse BAR:
    
    // bar.h
    
    class bar
    {
    public:
    void ausgabe();
    private:
    foo inst;
    };
    
    //bar.cpp
    
    #include "bar.h"
    #include < ALLE ANDEREN >
    
    void bar::ausgabe() 
    { 
    std::cout << inst.any << std::endl; 
    }
    
    // MAIN.CPP:
    
    #include "bar.h"
    #include "foo.h"
    #include <ALLE ANDEREN, zbsp. iostream,..>
    
    int main()
    {
    foo haha;
    haha.set(10);
    
    bar test;
    test.ausgabe();
    
    return 0;
    }
    

    und Fehler ist:

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    ich hoffe, ihr könnt mir bitte helfen 😉

    Mfg



  • Patrick S. schrieb:

    und Fehler ist:

    error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    ich hoffe, ihr könnt mir bitte helfen 😉

    Mit Sicherheit ist das nicht die Fehlermeldung die du bekommst. Weder die Angabe in welcher Datei noch Zeile steht dort. Dieser Fehler tritt in der Regel bei einer Methode/Funktion auf, bei der, der Rückgabewert nicht angegeben ist. Und auch nur wenn der Compiler recht gnädig ist (wie auch in der Warnung steht):

    Beispiel:

    class A
    {
      public:
        foo() { /*...*/ } // <-- Angabe des Rückgabewertes vergessen, int angenommen
    };
    

    Sehr häufig passiert das wenn man eine Klasse umbenannt hat, und den Konstruktor vergessen hat ebenso umzubenennen...

    cu André



  • das

    foo inst;
    

    muss falsch sein.

    mein konstruktor hat ja eigentlich nur folgenden Inhalt:

    KLASSE::KLASSE()
    {
    std::cout << "Konstruktor" << std::endl;
    }
    

    sollte doch eh nicht schaden, außerdem hab ich ihn auch ganz verschwinden lassen, trodzdem nichts.

    mfg



  • Kann mir bitte jemand helfen? 😉

    mfg



  • Nöö nachdem das wieder mal alle deutschsprachigen C++-Foren durchgegangen ist ... in mindestens 1nem die korrekte Lösung stand ... nein!


Anmelden zum Antworten