引用为类成员初始化

arj*_*soh 20 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
Run Code Online (Sandbox Code Playgroud)
#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;
}
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 33

您正在尝试分配bank,而不是初始化它:

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

bank是一个参考,因此必须初始化.您可以将它放在初始化列表中:

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank)
: Square(anID), taxAmount(amount), bank(theBank)
{}
Run Code Online (Sandbox Code Playgroud)


Kar*_*tel 6

“'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) {}
Run Code Online (Sandbox Code Playgroud)

  • +1 表示“初始化列表中未指定的内容将被默认初始化,并且引用没有默认初始化,因为它们必须始终引用某些内容” (2认同)

小智 5

错误是您试图通过未初始化的引用进行分配:无法分配 C++ 引用 - 它引用的对象已被分配 - 因此,如果它是成员,则必须在初始化程序列表中对其进行初始化(如编译器说)。