引用为类成员初始化

时间:2011-11-27 10:51:01

标签: c++ constructor reference

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

“'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 个答案:

答案 0 :(得分:32)

您正在尝试分配给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)
{}

答案 1 :(得分:4)

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

答案 2 :(得分:4)

  

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

错误的是TaxSquare::bank没有在构造函数库/成员初始化列表中初始化,正如它所说的那样。

“构造函数库/成员初始化列表”是有问题的构造函数TaxSquare::TaxSquare(int, int, Bank&)的初始化列表。您已经在使用它初始化基础(Square)。您必须使用它来初始化bank成员,因为它是引用类型。初始化列表中未指定的内容将进行默认初始化,并且引用没有默认初始化,因为它们必须始终引用某些内容,并且没有默认值可供引用。

老实说,我发现在99%的时间里使用C ++中数据成员的引用比它的价值更麻烦。使用智能指针,甚至是原始指针,你可能会更好。但是你应该仍然用初始化列表初始化它,即使你可以没有离开。同样适用于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) {}

答案 3 :(得分:1)

bank = theBank; 这个陈述意味着你将obj1分配给obj2并且它将调用Assignment运算符,这是错误的,因为bank是类型引用,它必须初始化,如下所述

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