«TaxSquare :: bank должен быть инициализирован в базе конструкторов / в списке инициализаторов элементов». Что не так в следующем коде классов?
Что неправильно в том, что TaxSquare::bank
не инициализируется в списке инициализации базы / члена конструктора, в точности так, как он говорит.
«Список инициализации базы / члена конструктора» - это список инициализации для рассматриваемого конструктора, TaxSquare::TaxSquare(int, int, Bank&)
. Вы уже используете его для инициализации базы (Square
). Вы должны использовать его для инициализации члена bank
, поскольку он имеет ссылочный тип. Вещи, не указанные в списке инициализации, инициализируются по умолчанию, и для ссылок нет инициализации по умолчанию, потому что они всегда должны ссылаться на что-то, и для них нет ссылок по умолчанию.
Честно говоря, я считаю, что использование ссылок для элементов данных в 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) {}