440,812 Members | 856 Online Need help? Post your question and get tips & solutions from a community of 440,812 IT Pros & Developers. It's quick & easy.

# friend und non-member function

 P: n/a hello, i should implement this class: Expand|Select|Wrap|Line Numbers namespace test_1 { class statistician { public: // CONSTRUCTOR statistician( ); // MODIFICATION MEMBER FUNCTIONS void next(double r); void reset( ); // CONSTANT MEMBER FUNCTIONS int length( ) const; double sum( ) const; double mean( ) const; double minimum( ) const; double maximum( ) const; // FRIEND FUNCTIONS friend statistician operator + (const statistician & s1, const statistician & s2); friend statistician operator * (double scale, const statistician & s); private: int count;       // How many numbers in the sequence double total;    // The sum of all the numbers in the sequence double tinyest;  // The smallest number in the sequence double largest;  // The largest number in the sequence };   // NON-MEMBER functions for the statistician class bool operator ==(const statistician& s1, const statistician& s2); }   But for me it is unfortuantely not clear what the actual difference between the friend, non-member function (operator ==) and the normal member function is and/or how these friend and non-member function have to be definied in the implementation file...? :(( can anybody help me here? matti Sep 8 '06 #1
5 Replies

 P: n/a pat270881 wrote: i should implement this class: Expand|Select|Wrap|Line Numbers namespace test_1 {    class statistician    {    public:        // CONSTRUCTOR        statistician( );        // MODIFICATION MEMBER FUNCTIONS        void next(double r);        void reset( );        // CONSTANT MEMBER FUNCTIONS        int length( ) const;        double sum( ) const;        double mean( ) const;        double minimum( ) const;        double maximum( ) const;        // FRIEND FUNCTIONS        friend statistician operator +            (const statistician & s1, const statistician & s2);        friend statistician operator *            (double scale, const statistician & s);    private:        int count;       // How many numbers in the sequence        double total;    // The sum of all the numbers in the sequence        double tinyest;  // The smallest number in the sequence        double largest;  // The largest number in the sequence    };    // NON-MEMBER functions for the statistician class    bool operator ==(const statistician& s1, const statistician& s2); }   But for me it is unfortuantely not clear what the actual difference between the friend, non-member function (operator ==) and the normal member function is and/or how these friend and non-member function have to be definied in the implementation file...? :(( can anybody help me here? Open the namespace and implement them. Or prefix each name with the name of the namespace. And if it's a member, prefix it with the name of the class as well. V -- Please remove capital 'A's when replying by e-mail I do not respond to top-posted replies, please don't ask Sep 8 '06 #2

 P: n/a pat270881 wrote: hello, i should implement this class: Expand|Select|Wrap|Line Numbers namespace test_1 {     class statistician     {     public:         // CONSTRUCTOR         statistician( );         // MODIFICATION MEMBER FUNCTIONS         void next(double r);         void reset( );         // CONSTANT MEMBER FUNCTIONS         int length( ) const;         double sum( ) const;         double mean( ) const;         double minimum( ) const;         double maximum( ) const;         // FRIEND FUNCTIONS         friend statistician operator +             (const statistician & s1, const statistician & s2);         friend statistician operator *             (double scale, const statistician & s);     private:         int count;       // How many numbers in the sequence         double total;    // The sum of all the numbers in the sequence         double tinyest;  // The smallest number in the sequence         double largest;  // The largest number in the sequence     };     // NON-MEMBER functions for the statistician class     bool operator ==(const statistician& s1, const statistician& s2); }   But for me it is unfortuantely not clear what the actual difference between the friend, non-member function (operator ==) and the normal member function is and/or how these friend and non-member function have to be definied in the implementation file...? :(( can anybody help me here? matti See these FAQs on friendship: http://www.parashift.com/c++-faq-lite/friends.html The gist is that the operator==() function can do all it needs without access to the private parts (since it can use the public member functions to retrieve and compare the data members), whereas the operator+() function must modify the private data members of the statistician object that it will return and cannot do so through the public member functions. See also these guidelines about overloading operators: http://www.parashift.com/c++-faq-lit....html#faq-13.9 Cheers! --M Sep 8 '06 #3

 P: n/a oh okay, thanks!! I have implemented only the skeleton of the implementation class but when I run the testfile (stattest.cpp) some strange errors occur: My header-file Expand|Select|Wrap|Line Numbers #ifndef STATS_H     // Prevent duplicate definition #define STATS_H #include    namespace test_1 { class statistician { public: // CONSTRUCTOR statistician( ); // MODIFICATION MEMBER FUNCTIONS void next(double r); void reset( ); // CONSTANT MEMBER FUNCTIONS int length( ) const; double sum( ) const; double mean( ) const; double minimum( ) const; double maximum( ) const; // FRIEND FUNCTIONS friend statistician operator + (const statistician & s1, const statistician & s2); friend statistician operator * (double scale, const statistician & s); private: int count;       // How many numbers in the sequence double total;    // The sum of all the numbers in the sequence double tinyest;  // The smallest number in the sequence double largest;  // The largest number in the sequence };   // NON-MEMBER functions for the statistician class bool operator ==(const statistician& s1, const statistician& s2); }   #endif   The implementation-file, as said only the definition of the functions in order to see if the testfile is started correctly at all: Expand|Select|Wrap|Line Numbers #include "stats.h"   using namespace test_1;     statistician::statistician() {   }   void statistician::next(double r) {   }   int statistician::length() const { return 0; }   double statistician::sum() const { return 0; }   double statistician::mean() const { return 0; }   double statistician::minimum() const { return 0; }   double statistician::maximum() const { return 0; }   bool operator ==(const statistician& s1, const statistician& s2) { return true; }   statistician operator + (const statistician & s1, const statistician & s2) { return s1; }   statistician operator * (double scale, const statistician & s) { return s; }   The testfile: Expand|Select|Wrap|Line Numbers #include x; s3 = x * s1; cout << "s3 has been set to " << x << " * s1" << endl; break; case 'Q': cout << "Ridicule is the best test of truth." << endl; break; default: cout << choice << " is invalid. Sorry." << endl; } } while ((choice != 'Q'));   return EXIT_SUCCESS;   }   void print_menu( ) { cout << endl; cout << "The following choices are available: " << endl; cout << " R  Activate one of the reset( ) functions" << endl; cout << " 1  Add a new number to the 1st statistician s1" << endl; cout << " 2  Add a new number to the 2nd statistician s2" << endl; cout << " 3  Add a new number to the 3rd statistician s3" << endl; cout << " T  Print a table of values from the statisticians" << endl; cout << " E  Test whether s1 == s2" << endl; cout << " +  Set the third statistician s3 equal to s1 + s2" << endl; cout << " *  Set the third statistician s3 equal to x*s1" << endl; cout << " Q  Quit this test program" << endl; }   char get_user_command( ) // Library facilties used: iostream.h { char command;   cout << "Enter choice: "; cin >command;   return command; }   double get_number( ) // Library facilties used: iostream.h { double result;   cout << "Please enter the next real number for the sequence: "; cin  >result; cout << result << " has been read." << endl; return result; }   void print_values(const statistician& s) // Library facilties used: iostream.h { cout << setw(10) << s.length( ); cout << setw(10) << s.sum( ); if (s.length( ) != 0) { cout << setw(10) << s.minimum( ); cout << setw(10) << s.mean( ); cout << setw(10) << s.maximum( ); } else cout << "      none      none      none"; cout << endl; }   The compilation works but when I run the testfile these errors occur: Expand|Select|Wrap|Line Numbers ------ Build started: Project: Assignment1, Configuration: Debug Win32 ------ Compiling... stattest.cpp Linking... stattest.obj : error LNK2019: unresolved external symbol "class main_savitch_2C::statistician __cdecl main_savitch_2C::operator*(double,class main_savitch_2C::statistician const &)" (??Dmain_savitch_2C@@YA?AVstatistician@0@NABV10@@Z) referenced in function _main stattest.obj : error LNK2019: unresolved external symbol "class main_savitch_2C::statistician __cdecl main_savitch_2C::operator+(class main_savitch_2C::statistician const &,class main_savitch_2C::statistician const &)" (??Hmain_savitch_2C@@YA?AVstatistician@0@ABV10@0@Z) referenced in function _main stattest.obj : error LNK2019: unresolved external symbol "bool __cdecl main_savitch_2C::operator==(class main_savitch_2C::statistician const &,class main_savitch_2C::statistician const &)" (??8main_savitch_2C@@YA_NABVstatistician@0@0@Z) referenced in function _main stattest.obj : error LNK2019: unresolved external symbol "public: void __thiscall main_savitch_2C::statistician::reset(void)" (?reset@statistician@main_savitch_2C@@QAEXXZ) referenced in function _main C:\Dokumente und Einstellungen\matti\Eigene Dateien\Visual Studio 2005\Projects\Assignment1\Debug\Assignment1.exe : fatal error LNK1120: 4 unresolved externals Build log was saved at "file://c:\Dokumente und Einstellungen\matti\Eigene Dateien\Visual Studio 2005\Projects\Assignment1\Assignment1\Debug\BuildLog.htm" Assignment1 - 5 error(s), 0 warning(s)   Does anybody know how i can fix that? :(( Sep 8 '06 #4

 P: n/a the namespace of the testfile is also test_1 and not main_savitch..., that was a mistake in the posting... Sep 8 '06 #5

 P: n/a I simply do not understand why these unresolved external symbol errors occurs..??? :( Does nobody knows here how I can fix these errors?? :( ------ Build started: Project: Assignment1, Configuration: Debug Win32 ------ Linking... stattest.obj : error LNK2019: unresolved external symbol "class main_savitch_2C::statistician __cdecl main_savitch_2C::operator*(double,class main_savitch_2C::statistician const &)" (??Dmain_savitch_2C@@YA?AVstatistician@0@NABV10@@Z ) referenced in function _main stattest.obj : error LNK2019: unresolved external symbol "class main_savitch_2C::statistician __cdecl main_savitch_2C::operator+(class main_savitch_2C::statistician const &,class main_savitch_2C::statistician const &)" (??Hmain_savitch_2C@@YA?AVstatistician@0@ABV10@0@Z ) referenced in function _main stattest.obj : error LNK2019: unresolved external symbol "bool __cdecl main_savitch_2C::operator==(class main_savitch_2C::statistician const &,class main_savitch_2C::statistician const &)" (??8main_savitch_2C@@YA_NABVstatistician@0@0@Z) referenced in function _main C:\Dokumente und Einstellungen\matti\Eigene Dateien\Visual Studio 2005\Projects\Assignment1\Debug\Assignment1.exe : fatal error LNK1120: 3 unresolved externals Build log was saved at "file://c:\Dokumente und Einstellungen\matti\Eigene Dateien\Visual Studio 2005\Projects\Assignment1\Assignment1\Debug\BuildL og.htm" Assignment1 - 4 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Sep 8 '06 #6

### This discussion thread is closed

Replies have been disabled for this discussion. 