2011-11-18 64 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客戶的不同利率;-)