friend



  • Ich kapiere das friend Schema nicht, soviel ich verstanden habe bedeutet das doch nur dass eine friend klasse oder methode auf private variablen einer klasse zugreifen darf oder?

    wieso funktioniert das dann nicht, wo doch alles public gemacht wurde?

    #include<iostream>
    
    using namespace std;
    
    class Vector
    {
    public:
        int x,y,z;
        Vector()
        {
            x = 2; y=5; z=6;
        }
    
        ostream& operator<< (ostream& Stream, const Vector& B)
        {
            Stream << B.x << " " << B.y << " " << B.z << endl;
            return Stream;
        }
    };
    
    int main()
    {
        Vector x;
        cout << x;
        return 0;
    }
    

    wenn ich friend hinzufüge klappts wie ich will ohne lieferts mir aber:

    main.cpp|15|error: `std::ostream& Vector::operator<<(std::ostream&, const Vector&)' must take exactly one argument|
    \main.cpp||In function `int main()':|
    \main.cpp|24|error: no match for 'operator<<' in 'std::cout << x'|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|63|note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|74|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|86|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|121|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|155|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|98|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\ostream|178|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\ostream|189|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\ostream|193|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\ostream|204|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|179|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|214|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|238|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\ostream|219|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|261|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|284|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ostream.tcc|307|note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]|
    ||=== Build finished: 2 errors, 0 warnings ===|
    


  • Ohne friend ist das eine Memberfunktion, welche als ersten Parameter implizit einen Zeiger auf die Instanz empfängt (this). Und der << - Operator hat als ersten Parameter halt einen stream. Daher das friend, welches dir dann die Funktion eigentilch unabhängig von der Klasse macht ( du möchtest ja die Klasse im zweiten Parameter empfangen).



  • kann jemand das etwas ausführlicher erklären?

    ich verstehe die erklärung leider nicht





  • shisha schrieb:

    kann jemand das etwas ausführlicher erklären?

    Was genau ist denn unklar?

    friend ist dazu gedacht, eine freie Funktion als Freund zu deklarieren. Eine freie Funktion ist etwas anderes als eine nicht-statische Elementfunktion.

    namespace ns
    {
      class foo
      {
        int privat;
        friend int bar(foo const&); 
    
        // Die Deklaration sagt: "Es gibt eine freie Funktion namens
        // bar im Namensraum ns, welche auf private Elemente zugreifen darf."
      };
    
      int bar(foo const& x) {
        return x.privat;
      }
    }
    

    Wenn Du die Definition in die Klasse verlagerst ist der Unterschied der, dass die Funktion "implizit inline" ist. Also:

    namespace ns
    {
      class foo
      {
        int privat;
        friend int bar(foo const& x) {return x.privat;}
      };
    }
    

    ...ist das gleiche wie...

    namespace ns
    {
      class foo
      {
        int privat;
        friend int bar(foo const& x);
      };
    
      inline int bar(foo const& x) {return x.privat;}
    }
    

    Gruß,
    SP



  • die letzte erklärung war wirklich sehr gut 🙂

    ich schau mir jetz nochmal den operator << genauer an um zu sehen was der genau fü parameter verlangt.

    Aber ansonsten hab ichs jetz verstanden

    herzlichen dank


Log in to reply