Ссылка как переменная члена - PullRequest
0 голосов
/ 04 декабря 2011

Может кто-нибудь объяснить мне, почему класс TaxWay в коде не может содержать переменную-член Bank, инициализированную ссылкой?Что я должен изменить в коде, чтобы сделать его правильным?Когда я изменяю переменную-член на ссылку как Bank&, тогда это работает.Я думал, что то же самое должно произойти с «не ссылочной переменной».Как это можно сделать?

class Bank;

class TaxWay : public Way
{
  public:
    TaxSquare(int, int, Bank&);
    virtual void process();

  private:
    int taxAmount;
    Bank bank;
};

TaxWay::TaxWay(int anID, int amount, Bank& theBank) 
: Way(anID),taxAmount(amount),bank(theBank) 
{
}

Я создаю объект как:

TaxWay TaxWay9(9,150, theBank);

Ответы [ 3 ]

6 голосов
/ 04 декабря 2011

Два важных момента:

  • Если вы хотите объявить переменную-член как Bank bank, вам необходимо включить файл заголовка, который имеет определение класса Bank.Простое предварительное объявление, как вы сделали, приведет к ошибке компиляции.

  • Однако, если вы хотите объявить его как Bank & bank ИЛИ Bank *bank, тогда достаточно предварительного объявления.В этом случае определение класса Bank не требуется, если только вы не хотите получить доступ к какому-либо члену Bank (например, во встроенном определении некоторых функций-членов класса TaxWay).

3 голосов
/ 04 декабря 2011

Одна вещь (которая может или не может быть вашей проблемой) состоит в том, что вы объявили Bank как предварительное объявление без определения. Когда компилятор достигнет TaxWay, вы не сможете объявить переменную-член типа Bank, потому что компилятор еще ничего не знает о классе Bank.

2 голосов
/ 04 декабря 2011

В этом примере класс TaxWay не может содержать копию банка, поскольку вы не определили класс Bank. Как минимум размер класса Bank должен быть известен, чтобы можно было выделить место.

С другой стороны, в зависимости от того, что содержит Bank, скопировать его может быть не очень хорошей идеей. Будет ли это также копировать деньги в банке? : -)

...