2011-11-27 31 views
15

Quiero inicializar una propiedad de una clase que contiene una referencia a otra clase pasando dicha referencia como un parámetro al constructor. Sin embargo, recibo un error:Referencia como inicialización de miembro de clase

"'TaxSquare :: bank' debe inicializarse en la lista de inicializadores de la base de constructores/miembros". ¿Qué está mal en el siguiente código de las clases?

#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 

Respuesta

25

que está intentando asignar a bank, no inicializarlo:

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

bank es una referencia, y por lo tanto debe ser inicializado. Lo hace poniéndolo en la lista de inicialización:

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

El error es que estamos tratando de asignar a través de una referencia sin inicializar: un C++ de referencia no se puede asignar - el objeto al que se refiere es asignado su lugar - y por lo tanto , si es un miembro, debe inicializarse en la lista de inicializadores (como dice el compilador).

4

“'TaxSquare::bank' must be initialized in constructor base/member initializer list”. What is wrong in the following code of the classes?

Lo que está mal es que TaxSquare::bank no se inicializa en la lista de inicialización del constructor de base/miembro, tal y como se dice.

"La lista de inicialización de base/miembro del constructor" es la lista de inicialización para el constructor en cuestión, TaxSquare::TaxSquare(int, int, Bank&). Ya lo está usando para inicializar la base (Square). Debe usarlo para inicializar el miembro bank, porque es de un tipo de referencia. Las cosas no especificadas en la lista de inicialización se inicializan por defecto, y no hay inicialización predeterminada para las referencias, porque siempre deben hacer referencia a algo, y no hay ningún valor predeterminado para que hagan referencia.

Honestamente, me parece que el uso de referencias para los miembros de datos en C++ es más problemático de lo que vale, el 99% del tiempo. Probablemente estés mejor con un puntero inteligente, o incluso uno en bruto. Pero debería todavía inicializar eso con la lista de inicialización, incluso si pudiera salir sin él. Lo mismo vale para el taxAmount, realmente.

// 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) {} 
+0

+1 for "Las cosas no especificadas en la lista de inicialización se inicializan por defecto, y no hay inicialización predeterminada para las referencias, porque siempre deben hacer referencia a algo " –

1

bank = theBank; esta declaración significa que se está asignando a obj1 obj2 y se llamará Operador de asignación que está mal como el banco es del tipo de referencia debe ser inicializado como se menciona a continuación

TaxSquare :: TaxSquare (int ANID, int cantidad, el Banco & thebank): Square (anID), bank (theBank) {}

Cuestiones relacionadas