引用作为类成员初始化

25

我想通过将一个类的引用作为参数传递给构造函数来初始化另一个类的属性。然而,我收到了一个错误:

“'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
4个回答

41

您试图将值分配给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)
{}

7
以下类的代码存在什么问题:“'TaxSquare::bank' must be initialized in constructor base/member initializer list”?
问题在于,正如它所说的那样,“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) {}

2
在初始化列表未指定的成员将会被默认初始化,但是对于引用类型不存在默认初始化,因为它们必须始终引用某些内容。+1 - Bojan Komazec

5
错误是您尝试通过未初始化的引用进行赋值:C++引用无法被赋值 - 它所指向的对象将被赋值 - 因此,如果它是一个成员,则必须在初始化列表中进行初始化(就像编译器所说的那样)。

1

bank = theBank; 这个语句的意思是将obj1赋值给obj2,这将调用赋值运算符,但是由于bank是引用类型,必须像下面一样初始化:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接