2011-11-27 44 views
15

Desidero inizializzare una proprietà di una classe che contiene un riferimento a un'altra classe passando tale riferimento come parametro al costruttore. Tuttavia, viene visualizzato un messaggio di errore:Riferimento come inizializzazione del membro della classe

"'TaxSquare :: bank' deve essere inizializzato in base costruttore/elenco inizializzatore membro". Cosa c'è di sbagliato nel seguente codice delle classi?

#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 

risposta

25

si sta tentando di assegnare alla bank, non inizializzarlo:

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

bank è un punto di riferimento, e quindi deve essere inizializzato. Fate in modo mettendolo nella lista di inizializzazione:

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

L'errore è che si sta cercando di assegnare attraverso un riferimento non inizializzato: non può essere assegnato un C++ di riferimento - l'oggetto si riferisce è stato assegnato invece - e così , se si tratta di un membro, deve essere inizializzato nella lista di inizializzazione (come dice il compilatore).

4

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

Cosa c'è di sbagliato è che TaxSquare::bank non viene inizializzato nella lista di inizializzazione costruttore di base/elemento, esattamente come si dice.

"La base di costruttore/elenco di inizializzazione dei membri" è l'elenco di inizializzazione per il costruttore in questione, TaxSquare::TaxSquare(int, int, Bank&). Lo stai già utilizzando per inizializzare la base (Square). È necessario utilizzarlo per inizializzare il membro bank, perché è di un tipo di riferimento. Le cose non specificate nella lista di inizializzazione vengono inizializzate di default, e non vi è alcuna inizializzazione di default per i riferimenti, perché devono sempre fare riferimento a qualcosa, e non c'è alcun valore predefinito a cui fare riferimento.

Onestamente, trovo che l'utilizzo di riferimenti per i membri dati in C++ sia più un problema che non ne vale la pena, il 99% delle volte. Probabilmente stai meglio con un puntatore intelligente, o addirittura con un puntatore grezzo. Ma lo dovrebbe inizializzarlo ancora con l'elenco di inizializzazione, anche se è possibile uscire senza. Lo stesso vale per lo taxAmount, davvero.

// 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 per "Le cose non specificate nella lista di inizializzazione vengono inizializzate di default, e non c'è inizializzazione di default per i riferimenti, perché devono sempre fare riferimento a qualcosa " –

1

bank = theBank; questa dichiarazione significa che si sta assegnando a obj2 obj1 e sarà chiamata Operatore di assegnazione che è sbagliato in quanto banca è di riferimento di tipo deve essere inizializzata come indicato di seguito

TaxSquare :: TaxSquare (int ANID, int quantità, Banca & theBank): Square (anID), bank (theBank) {}

Problemi correlati