【问题标题】:Reference as class member initialization引用作为类成员初始化
【发布时间】:2011-11-27 10:51:00
【问题描述】:

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

“'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

【问题讨论】:

    标签: c++ constructor reference


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      问题在于 TaxSquare::bank 没有在构造函数基/成员初始化列表中初始化,正如它所说的那样。

      “构造函数基/成员初始化列表”是相关构造函数的初始化列表,TaxSquare::TaxSquare(int, int, Bank&amp;)。您已经在使用它来初始化基础 (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) {}
      

      【讨论】:

      • +1 表示“未在初始化列表中指定的事物被默认初始化,并且引用没有默认初始化,因为它们必须始终引用某些东西”
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        银行 = 银行; 此语句意味着您将 obj1 分配给 obj2 并且它将调用错误的赋值运算符,因为 bank 是类型引用它必须如下所述进行初始化

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-08
          • 1970-01-01
          • 1970-01-01
          • 2011-04-02
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          相关资源
          最近更新 更多