未定义参考

时间:2011-11-18 16:02:52

标签: c++ g++

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

  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

4 个答案:

答案 0 :(得分:8)

您刚刚在类定义中声明了静态成员InterestRate,但是,
您还需要在cpp文件中定义静态成员:

double bank::InterestRate = 0.0;

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

答案 1 :(得分:3)

这是因为行:

static double InterestRate;

是声明而不是定义 - 即它不创建变量,而只是表示存在这样的变量。这在C ++中非常直观,但您可以处理它: - )

添加任何C ++文件:

double bank::InterestRate;

定义此变量。

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

答案 2 :(得分: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客户的不同利率; - )

答案 3 :(得分:1)

猜猜你必须

double bank :: InterestRate = 0 .;

在类声明之外的C文件中