2011-11-18 98 views
3

我的程序很简单。一类银行账户。每个账户都有一个余额和一个权力。每个账户都有相同的利率。编译时遇到了错误。怎么了?提前致谢。未定义的参考

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 
+1

为什么所有函数都是静态的,并且采用类型bank的隐式第一个参数? – hochl

+0

无论您的设计错误是什么,都很奇怪。 – stnr

+1

+1对于一个完整的程序,实际上证明你有错误。下次请不要在其中输入行号。 –

回答

8

你刚才声明的静态成员InterestRate在类定义,但是,
你还需要在你的CPP文件的一个来定义静态成员:

double bank::InterestRate = 0.0; 

没有这个链接器找不到它的定义,并给出链接错误。

+0

ahh ..谢谢。我忘了。总是需要定义一个静态成员 – ihm

1

猜你一定有

双岸::的InterestRate = 0;

在C文件

类声明

3

出现这种情况的原因外行:

static double InterestRate; 

是一个声明不是定义 - 即它不创建一个变量,而仅仅表明这样的变量存在。这是C++非常反直觉的,但你可以对付它:-)

添加任何C++文件:

double bank::InterestRate; 

来定义这个变量。

理想情况下,如果将项目拆分为.cpp anad .h文件,则应将其放入相应的.cpp文件中,而类声明在.h中。

+0

是否可以通过这种方式定义一个静态数据成员? 'static double InterestRate = 0。0' – ihm

+0

不,初始值必须进入定义而不是声明。但是,对于'static const',你可以这样做,并省略类之外的定义。 – Kos

+0

所有这些大惊小怪的原因是C++的旧的两阶段编译模型。所有使用该静态字段的模块必须知道字段声明(在类定义内),但只有一个模块必须实际创建该变量,以便在每个使用该模块的模块中不会单独创建该变量。因此,静态变量和全局变量(实际上是同一件事)需要分解为声明和定义。 (常量静态字段可能会被复制,因为它们不会改变,所以语言提供了简写。) – Kos

2

我想你想要做的是这样的:

#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; 
} 

我仍然不知道为什么你在第一时间使用静态的,而静态成员用于的东西,涉及到类本身,而不是一个实例。你正在创建一个账户类(提示:最好称之为这个类账户),现在你正在创建一个这个类的实例,它很可能不会与其他账户共享它的数据!

作为旁注,银行账户通常并不都具有相同的利率,所以财产不应该是静态的。我建议在每个账户中增加一个static double defaultInterest会员,并为每个账户添加一个double interest实例变量,默认情况下它被分配默认利率,但可以调整为包含VIP客户的不同利率;-)