Reputation: 1863
my program is simple. a class of a bank account. Each account has a balance and an ower. each account has the same interest rate. I got the error when compile it. What's wrong? Thanks in advance.
2 #include <iostream>
3 #include <string>
4 using namespace std;
5 class bank
6 {
7 private:
8 double balance;
9 string owner;
10 static double InterestRate;
11 public:
12 static void AccountInfo(const bank& ac)
13 {
14 cout << "name: " << ac.owner << endl << "balance: " << ac.balance;
15 }
16 static void SetAccount(bank& ac)
17 {
18 cout << "enter a name: " << flush;
19 cin >> ac.owner;
20 cout << "enter a balance: " << flush;
21 cin >> ac.balance;
22 }
23 static void SetRate(const double& n)
24 {
25 InterestRate = n;
26 }
27 static void Balance(bank& ac)
28 {
29 ac.balance += ac.balance * InterestRate;
30 }
31 };
32 int main ()
33 {
34 bank NewAccount;
35 bank::SetAccount(NewAccount);
36 bank::SetRate(0.15);
37 bank::Balance(NewAccount);
38 bank::AccountInfo(NewAccount);
39 return 0;
40 }
and the output is:
/tmp/ccUh8Sd9.o: In function `bank::SetRate(double const&)':
e1237.cpp:(.text._ZN4bank7SetRateERKd[bank::SetRate(double const&)]+0x12): undefined reference to `bank::InterestRate'
/tmp/ccUh8Sd9.o: In function `bank::Balance(bank&)':
e1237.cpp:(.text._ZN4bank7BalanceERS_[bank::Balance(bank&)]+0x1c): undefined reference to `bank::InterestRate'
collect2: ld returned 1 exit status
Upvotes: 3
Views: 2023
Reputation: 12920
I think what you want to do is this:
#include <iostream>
#include <string>
using namespace std;
class bank
{
private:
static double InterestRate;
double balance;
string owner;
public:
void AccountInfo()
{
cout << "name: " << owner << endl;
cout << "balance: " << balance << endl;
}
void SetAccount()
{
cout << "enter a name: " << flush;
cin >> owner;
cout << "enter a balance: " << flush;
cin >> balance;
}
static void SetRate(const double& n)
{
InterestRate = n;
}
void Balance()
{
balance += balance * InterestRate;
}
};
double bank::InterestRate=0;
int main ()
{
bank NewAccount;
bank::SetRate(0.15);
NewAccount.SetAccount();
NewAccount.Balance();
NewAccount.AccountInfo();
return 0;
}
I'm still not sure why you used static in the first place, but static members are used for stuff that relates to the class as such, and not to an instance. You're creating an account class (hint: better call this class Account), and now you're creating an instance of this class that most probably won't share its data with other accounts!
As a sidenote, bank accounts usually don't all have the same interest rate, so event that property should not be static. I suggest adding a static double defaultInterest
member to the class, and a double interest
instance variable to each account, which is assigned the default interest rate by default, but can be tweaked to contain a different interest rate for VIP customers ;-)
Upvotes: 3
Reputation: 72241
this happens because the line:
static double InterestRate;
is a declaration not a definition - i.e. it doesn't create a variable, but merely indicates that such a variable exists. This is very counter-intuitive in C++, but you can deal with it :-)
Add in any C++ file:
double bank::InterestRate;
to define this variable.
Ideally, if you split your project into .cpp anad .h files, you should have it in the corresponding .cpp file, while the class declaration is in .h.
Upvotes: 3
Reputation: 48232
Guess you must have
double bank::InterestRate = 0.;
in your C file outside of the class declaration
Upvotes: 1
Reputation: 206508
You just declared the static member InterestRate
in your class definition but,
You also need to define your static member in one of your cpp file:
double bank::InterestRate = 0.0;
Without this the linker cannot find its definition and gives the linking error.
Upvotes: 9