web-dev-qa-db-ja.com

クラスメンバーの初期化としての参照

このような参照をパラメーターとしてコンストラクターに渡すことにより、別のクラスへの参照を保持するクラスのプロパティを初期化したいと思います。しかし、私はエラーを受け取ります:

「 '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
20
arjacsoh

初期化ではなく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)
{}
33

「 'TaxSquare :: bank'はコンストラクタベース/メンバー初期化子リストで初期化する必要があります」。次のクラスのコードの何が問題になっていますか?

間違っているのは、_TaxSquare::bank_がコンストラクタベース/メンバー初期化リストで初期化されていないことです。

「コンストラクタベース/メンバー初期化リスト」は、問題のコンストラクタTaxSquare::TaxSquare(int, int, Bank&)の初期化リストです。ベース(Square)を初期化するためにすでに使用しています。 bankメンバーは参照型であるため、これを使用して初期化する必要があります。初期化リストで指定されていないものはdefault-initializedを取得します。参照にはdefault-initializationがありません。それらは常に何かを参照する必要があり、参照するデフォルトの何かがないためです。

正直なところ、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) {}
_
4
Karl Knechtel

エラーは、初期化されていない参照を介して割り当てようとしていることです。C++参照を割り当てることはできません。参照するオブジェクトは代わりに割り当てられます。そのため、メンバーの場合は、初期化リストで初期化する必要があります言う)。

4
vbar

銀行= theBank;このステートメントは、obj1をobj2に割り当てていることを意味します。これは、バンクが参照型であるため、間違っている代入演算子を呼び出します。これは、以下で説明するように初期化する必要があります。

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

1
Riz