I was trying to follow a homework example I found online and am getting stuck.
I haven't done much with over loaded operators, friend functions, or reference operators, so am having a hard time figuring out why I get a linking error.
They give you the header file with the function prototypes defined (I'm assuming this is correct since it was given as part of the problem):
#include <cctype> // Provides toupper
#include <iomanip> // Provides setw to set the width of an output
#include <iostream> // Provides cout, cin
#include <cstdlib> // Provides EXIT_SUCCESS
#include "stats.h" // Provides the Statistician class
usingnamespace main_savitch_2C;
usingnamespace std;
void print_menu( );
char get_user_command( );
double get_number( );
void print_values(const statistician& s);
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 << " + 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( )
{
char command;
cout << "Enter choice: ";
cin >> command;
return command;
}
double get_number( )
{
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)
{
cout << setw(10) << s.length( );
cout << setw(10) << s.sum( );
if (s.length( ) != 0)
{
cout << setw(10) << s.abs_minimum( );
cout << setw(10) << s.abs_maximum( );
cout << setw(10) << s.minimum( );
cout << setw(10) << s.mean( );
cout << setw(10) << s.maximum( );
}
else
cout << " none none none none none";
cout << endl;
}
int main( )
{
statistician s1, s2, s3; // Three statisticians for us to play with
char choice; // A command character entered by the user
double x; // Value for multiplication x*s1
cout << "Three statisticians s1, s2, and s3 are ready to test." << endl;
do
{
cout << endl;
print_menu( );
choice = toupper(get_user_command( ));
switch (choice)
{
case'R':
cout << "Which one should I reset (1, 2, 3) " << endl;
choice = get_user_command( );
switch (choice)
{
case'1': s1.reset( );
break;
case'2': s2.reset( );
break;
case'3': s3.reset( );
break;
}
cout << "Reset activated for s" << choice << "." << endl;
break;
case'1':
s1.next(get_number( ));
break;
case'2':
s2.next(get_number( ));
break;
case'3':
s3.next(get_number( ));
break;
case'T':
cout << "The values are given in this table:" << endl;
cout << " LENGTH SUM"
<< " ABS_MIN ABS_MAX"
<< " MINIMUM MEAN MAXIMUM" << endl;
cout << " s1";
print_values(s1);
cout << " s2";
print_values(s2);
cout << " s3";
print_values(s3);
break;
case'+':
s3 = s1 + s2;
cout << "s3 has been set to s1 + s2" << endl;
break;
case'*':
cout << "Please type a value for x: ";
cin >> 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;
break;
}
}
while (choice != 'Q');
return EXIT_SUCCESS;
}
So I wrote the following with stub functions, but get unresolved external symbol for the + OPERATOR and * OPERATOR in the MAIN function of the test code.
Why do i get those errors? Help would greatly be appreciated, as well as an explanation. I've read the articles I could find on this site and have searched the web, but I still don't understand the problem.
actual errors:
1>------ Build started: Project: Statistician, Configuration: Debug Win32 ------
1> stats.cpp
1>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
1>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
'using namespace' is not a good idea. Why that effort with creating a namespace and then later wipe it out?
And like you see the compiler do not always get it the way you think.