resolucion - programacion orientada a objetos c++ ejemplos
Referencia como inicialización de miembro de clase. (4)
"''TaxSquare :: bank'' debe inicializarse en la lista de inicializadores de base / miembro de constructor". ¿Qué hay de malo en el siguiente código de las clases?
Lo que está mal es que TaxSquare::bank
no se está inicializando en la lista de inicialización de base / miembro del constructor, exactamente como se indica.
"La base de constructor / lista de inicialización de miembros" es la lista de inicialización para el constructor en cuestión, TaxSquare::TaxSquare(int, int, Bank&)
. Ya lo estás usando para inicializar la base ( Square
). Debe usarlo para inicializar el miembro del bank
, ya que 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 por defecto para las referencias, porque siempre deben hacer referencia a algo, y no hay algo por defecto para que hagan referencia.
Honestamente, encuentro que usar referencias para 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 crudo. Pero aún debe inicializar eso con la lista de inicialización, incluso si pudiera escapar sin ella. Lo mismo ocurre con la cantidad de taxAmount
, en realidad.
// 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) {}
Quiero inicializar una propiedad de una clase que contiene una referencia a otra clase pasando dicha referencia como parámetro al constructor. Sin embargo recibo un error:
"''TaxSquare :: bank'' debe inicializarse en la lista de inicializadores de base / miembro de constructor". ¿Qué hay de malo 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
El error es que está intentando asignar a través de una referencia no inicializada: no se puede asignar una referencia de C ++ (el objeto al que se refiere se asigna en su lugar) y, si es un miembro, debe inicializarse en la lista de inicializadores (como el compilador dice).
Está intentando asignar al 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 haces poniéndolo en la lista de inicializadores:
TaxSquare::TaxSquare(int anID, int amount, Bank& theBank)
: Square(anID), taxAmount(amount), bank(theBank)
{}
banco = el Banco; esta declaración significa que está asignando obj1 a obj2 y llamará al Operador de asignación, que es incorrecto, ya que el banco es de referencia de tipo; se debe inicializar como se menciona a continuación
TaxSquare :: TaxSquare (int anID, int amount, Bank & theBank): Square (anID), bank (theBank) {}