Наследование ... Синтаксис C ++ - PullRequest
1 голос
/ 30 сентября 2011

Мне нужно создать тривиальный класс, который имеет несколько подклассов, и у одного из этих подклассов есть собственный подкласс.

AccountClass.h

#ifndef Account_h
#define Account_h

class Account{

public:
    //Account(){balance = 0.0;}; Here's where the problem was
    Account(double bal=0.0){ balance = bal;};
    double getBal(){return balance;};

protected:
    double balance;
};
#endif

SavingsAccount.h

#ifndef SavingsAccount_h
#define SavingsAccount_h
#include "AccountClass.h"
class SavingsAccount : public Account{

public:
    //SavingsAccount(); And here
    SavingsAccount(double bal = 0.0, int pct = 0.0){ balance = bal; rate = pct; } : Account(bal);
    void compound(){ balance *= rate; };
    void withdraw(double amt){balance -= amt;};

protected:
    double rate;
};

#endif

CheckingAccount.h

#ifndef CheckingAccount_h
#define CheckingAccount_h
#include "AccountClass.h"
class CheckingAccount : public Account{

public:
    //CheckingAccount(); Here also
    CheckingAccount(double bal = 0.0, double lim = 500.0, double chg = 0.5){ balance = bal; limit = lim; charge = chg;} : Account(bal);
    void cash_check(double amt){ balance -= amt;};

protected:
    double limit;
    double charge;
};

#endif

TimeAccount.h

#ifndef TimeAccount_h
#define TimeAccount_h
#include "SavingsAccount.h"
class TimeAccount : public SavingsAccount{

public:
    //TimeAccount(); ;)
    TimeAccount(double bal = 0.0, int pct = 5.0){ balance = bal; rate = pct;} : SavingsAccount(bal,pct);
    void compound(){ funds_avail += (balance * rate); };
    void withdraw(double amt){funds_avail -= amt;};

protected:
    double funds_avail;
};

#endif

Я продолжаю получать сообщения о том, что определены конструкторы по умолчанию, а также все переменные, которые не существуют ...

Справка!

Редактировать:

Исправлен препроцессор ifndef's

Также это было решено.Спасибо @Coincoin!

Ответы [ 5 ]

2 голосов
/ 30 сентября 2011

Вы не определили свои конструкторы по умолчанию, но они вызываются по умолчанию, когда вы выводите новые классы. Похоже, что TimeAccount будет виновником этой проблемы, поскольку он использует конструктор по умолчанию SavingsAccount. Однако все они должны быть определены, а не просто объявлены.

1 голос
/ 30 сентября 2011

В способе определения ваших конструкторов есть несколько ошибок.

  • Некоторые из них не имеют определенного тела
  • Синтаксические списки инициализации не в нужном месте
  • Вы пытаетесь определить два конструктора по умолчанию, используя значения по умолчанию.

Список инициализации находится между подписью и телом.

Вроде так:

SavingsAccount(double bal = 0.0, int pct = 0.0)
:Account(bal)
{
   balance = bal; rate = pct;
}

Кроме того, у вас уже есть конструктор по умолчанию, но у вас есть список параметров со всеми параметрами со значениями по умолчанию, что означает, что вы пытаетесь определить два конструктора по умолчанию. Необходимо либо удалить значение по умолчанию для параметра bal, либо удалить конструктор по умолчанию и использовать конструктор со значением по умолчанию в качестве конструктора по умолчанию.

Вот так:

Account(){balance = 0.0;};
Account(double bal){ balance = bal;}

или

Account(double bal=0.0){ balance = bal;}  
1 голос
/ 30 сентября 2011

Эти:

SavingsAccount();
CheckingAccount();
TimeAccount();

должны иметь определения, поэтому:

SavingsAccount(){};
CheckingAccount(){};
TimeAccount(){};

должно работать

0 голосов
/ 30 сентября 2011

Вам нужно написать конструкторы по умолчанию для всего. Кроме того, убедитесь, что вы следуете правилу трех, если вам нужно определить конструктор копирования / деструктор / оператор присваивания.

TimeAccount():
  bal(0),
  pct(5.0)
{
}

TimeAccount(double bal, int pct)
{
  balance = bal; 
  rate = pct;
}
0 голосов
/ 30 сентября 2011

Если у вас есть значения по умолчанию для всех аргументов конструктора, как компилятор узнает, что вызывать, когда вы пишете:

TimeAccount t;

Возможно, вы видите ошибки типа "неоднозначный вызов функции". Кроме того, почему pct int в TimeAccount()? По умолчанию используется аргумент double, и он сохраняет это значение в поле типа double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...