friend problem :(


  • 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!



  • (D)Evil schrieb:

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

    Deviloper komm schon 😉
    bitte

    mfg patrick s.



  • Hast du diesen Beitrag mal durchgelesen?

    asc schrieb:

    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é

    btw - der compiler sagt normalerweise auch dazu, WO er den Fehler entdeckt hat.

    PS: Und wenn du noch zehnmal die selbe Meldung schreibst, erhöht sich dadurch nicht der Informationsgehalt 😉


Anmelden zum Antworten