未定义的参考
undefined reference
程序很简单。银行账户的一类。每个账户都有余额和余额。每个账户的利率都是一样的。我得到了错误,当编译它。怎么了?提前谢谢。
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 }
,输出为:
/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
您刚刚在类定义中声明了静态成员InterestRate
,但是,
您还需要在一个cpp文件中定义静态成员:
double bank::InterestRate = 0.0;
如果没有这个,链接器将无法找到它的定义并给出链接错误。
这是因为:
static double InterestRate;
是声明而不是定义——也就是说,它不创建变量,而只是表明存在这样一个变量。这在c++中是非常违反直觉的,但是你可以处理它:-)
添加任何c++文件:
double bank::InterestRate;
定义这个变量。
理想情况下,如果您将项目拆分为。cpp和。h文件,则应该将其放在相应的。cpp文件中,而类声明则放在。h中。
我认为你应该这样做:
#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;
}
我仍然不确定为什么你首先使用静态,但是静态成员用于与类相关的东西,而不是实例。您正在创建一个帐户类(提示:最好将这个类称为account),现在您正在创建这个类的实例,它很可能不会与其他帐户共享其数据!
作为旁注,银行账户通常不都有相同的利率,所以财产不应该是静态的。我建议在类中添加一个static double defaultInterest
成员,并为每个帐户添加一个double interest
实例变量,默认情况下分配默认利率,但可以调整为包含VIP客户的不同利率;-)
我想你一定有
double bank::InterestRate = 0.;
在类声明之外的C文件
相关文章:
- GTest EXPECT_EQ给出未定义的错误参考
- 在VSCode中编译C++给了我一个未定义的参考
- Armadillo正在为共享的lapack库获取未定义的参考
- 我对C++程序有一个未定义的参考,不知道如何处理它
- 未定义的符号参考'pthread_rwlock_wrlock@@GLIBC_2.2.5'
- 新的C ,未定义的参考
- ROS中未定义的参考误差到OpenCV图像转换器
- 使用Arduino IDE的构造函数的未定义参考错误
- 未定义的参考错误链接天然函数Android
- QT的倍频程:未定义的参考
- 未定义的参考,差异使用 CUDA 的 OpenCV 中的双边过滤器
- MSYS2静态QT未定义的参考问题
- LLVM-5.0 MakeFile未定义的参考失败
- 尝试在Windows结果上使用GLOG未定义的参考
- 从链接中缺少什么,导致未定义的参考
- 带有静态库的Android NDK:链接器始终抛出“未定义的参考”
- Lambdas的C 向量 - 未定义的参考
- __extern_inline func导致未定义的参考错误
- OPENCV筛选未定义的参考问题
- C 指针未定义的参考