2011-11-27 130 views
15

我想通过将这样的引用作为参数传递给构造函数来初始化保存对另一个类的引用的类的属性。但是,我收到一个错误:引用作为类成员初始化

“'TaxSquare :: bank'必须在构造函数库/成员初始值设定项列表中初始化”。 下面的类代码有什么错误?

#ifndef TAXSQUARE_H 
#define TAXSQUARE_H 
#include "Square.h" 

class Bank; 

class TaxSquare : public Square 
{ 
    public: 
     TaxSquare(int, int, Bank&); 
     virtual void process(); 

    private: 
     int taxAmount; 
     Bank& bank; 

}; 
#endif 
#include <iostream> 
#include "TaxSquare.h" 
#include "Player.h" 
#include "Bank.h" 
using namespace std; 

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : Square(anID) 
{ 
    taxAmount = amount; 
    bank = theBank; 
} 
#ifndef BANK_H 
#define BANK_H 

class Bank 
{ 
public: 
    Bank(int, int, int); 
    void getMoney(int); 
    void giveMoney(int); 
    void grantHouse(); 
    void grantHotel(); 

private: 
    int sumMoney; 
    int numOfHouses; 
    int numOfHotels; 

}; 

#endif 

回答

25

您正在尝试将分配给bank,不初始化:

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : Square(anID) 
{ 
    // These are assignments 
    taxAmount = amount; 
    bank = theBank; 
} 

bank是一个参考,因此它必须被初始化。您可以通过把它在初始化列表中这样做:

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) 
: Square(anID), taxAmount(amount), bank(theBank) 
{} 
4

的错误是你试图通过一个未初始化的参考以分配:C++引用不能分配 - 这指的是,而不是分配对象 - 等,如果它是一个成员,它必须在初始化列表中进行初始化(就像编译器所说的那样)。

4

“'TaxSquare::bank' must be initialized in constructor base/member initializer list”. What is wrong in the following code of the classes?

什么是错的是,TaxSquare::bank没有被初始化在构造函数基/成员初始化列表,正是因为它说。

“构造函数库/成员初始化列表”是相关构造函数TaxSquare::TaxSquare(int, int, Bank&)的初始化列表。您已经在使用它来初始化基地(Square)。您必须使用它来初始化bank成员,因为它是引用类型。没有在初始化列表中指定的事物会获得默认初始化,并且没有引用的默认初始化,因为它们必须始终引用某些内容,并且没有缺省值供他们引用。

老实说,我发现在C++中使用数据成员的引用比99年的时间值得的更麻烦。用智能指针,或者甚至是纯粹的指针,你可能会更好。但你应该仍初始化与初始化列表,即使你可以离开没有。真的,taxAmount也是如此。

// TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : Square(anID) 
// That thing after the colon is the initialization list:  ^^^^^^^^^^^^ 
// So add the other members to it, and then notice that there is nothing left 
// for the constructor body to do: 
TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : 
Square(anID), taxAmount(amount), bank(theBank) {} 
+0

+1对于“初始化列表中未指定的内容获取默认初始化,并且没有引用的默认初始化,因为它们必须始终引用“ –

1

bank = theBank; 这一声明意味着你要分配给OBJ1和OBJ2它会调用赋值运算符是错误的,因为银行的类型为参考下面

TaxSquare :: TaxSquare提到必须intialized(INT ANID,诠释金额,银行& theBank ):Square(anID),bank(theBank){}