Нужна помощь с двумя ошибками (C ++) - PullRequest
0 голосов
/ 01 мая 2011

Я некоторое время занимался кодированием, и это, вероятно, простая ошибка, что я просто упускаю из виду недостаток сна, но проблема возникает с этим сегментом кода.

do
{
    aWithIntAcct.enterAccountData();
    aWithIntAcct.getSavInfo();
    aWithIntAcct.getCheckingInfo();
    checkAcct.push_back(aWithIntAcct);
    cout << "Would you like to enter another Checking Account with interest? y or n ";
    cin >> quitChar;
}while(quitChar != QUIT);

это говорит о том, что у меня есть неоднозначный доступ к 'enterAccountData' (ошибка C2385) Это противоречит другому не найденному идентификатору (ошибка C3861).

Мои классы унаследованы, поэтому я не уверен, почему этот инстанс работает на меня. Есть предложения?

ОТДЫХ КОДА:

#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
template <class T>
void repeatValue(T val, int times)
{
for(int x = 0; x < times; x++)
{
    cout << "-";
}
};
template <class T>
void produceReport(int tableRows, string title, T acctType)
{
cout << tableRows << endl;
cout << title << endl;
cout << acctType;
};

class BankAccount
{
friend ostream& operator<<(ostream&, const BankAccount&);
friend istream& operator>>(istream&, BankAccount&);
private:
int acctNum;
double acctBal;
public:
BankAccount(int = 0,double = 0.0);

double operator+=(BankAccount);
int operator+(BankAccount);
friend bool operator>(BankAccount &acctBalOne, BankAccount &acctBalTwo);
friend bool operator<(BankAccount &acctBalOne, BankAccount &acctBalTwo);
int operator==(const BankAccount acctNumOne);
void enterAccountData();
void displayAccount();
void setAcctNum(int);
void setAcctBal(double);
int getAcctNum();
double getAcctBal();
};
BankAccount::BankAccount(int num, double bal)
{
acctNum = num;
acctBal = bal;
}
double BankAccount::operator+=(BankAccount bankAcct)
{
acctBal += acctBal + bankAcct.acctBal;
return acctBal;
}
int BankAccount::operator+(BankAccount newAcctNum)
{
const int INCREMENT = 1;
newAcctNum.acctNum = acctNum + INCREMENT;
return newAcctNum.acctNum;
}
bool operator>(BankAccount &acctBalOne, BankAccount &acctBalTwo)
{
return acctBalOne.acctBal > acctBalTwo.acctBal;
}
bool operator<(BankAccount &acctBalOne, BankAccount &acctBalTwo)
{
return acctBalOne.acctBal < acctBalTwo.acctBal;
}
int BankAccount::operator== (const BankAccount acctNumOne)
{
int truth = 0;
if(acctNum == acctNumOne.acctNum)
    truth = 1;
return truth;
}
ostream& operator<<(ostream& display, const BankAccount& aAcct)
{
display << "Account #" << aAcct.acctNum << endl;
display << "Account Balance $" << aAcct.acctBal << endl;
return display;
}
istream& operator>>(istream& dataIn, BankAccount& aAcct)
{
cout << endl << "Enter in an Account # ";
dataIn >> aAcct.acctNum;
cout << "Enter in an Account Balance $ ";
dataIn >> aAcct.acctBal;
return dataIn;
}
void BankAccount::enterAccountData()
{
cout << "Enter the Account:#";
cin >> acctNum;
cout << endl << "Enter the Account Balance:$";
cin >> acctBal;
}
void BankAccount::displayAccount()
{
cout << "The Account number is #" << acctNum << endl;
cout << "The Account Balance is $" << acctBal << endl;
}
void BankAccount::setAcctNum(int num)
{
acctNum = num;
}
void BankAccount::setAcctBal(double bal)
{
acctBal = bal;
}
int BankAccount::getAcctNum()
{
return acctNum;
}
double BankAccount::getAcctBal()
{
return acctBal;
}
class SavingsAccount : public BankAccount
{
friend ostream& operator<<(ostream&, const SavingsAccount&);
private:
double interest;
public:
SavingsAccount(double = 0.0);
void displaySavAccount();
void getSavInfo();
};
SavingsAccount::SavingsAccount(double intRate)
{
interest = intRate;
}
void SavingsAccount::getSavInfo()
{
cout << "Enter Interest Rate: ";
cin >> interest;
}
ostream& operator<<(ostream& display, SavingsAccount& aSavAcct)
{
aSavAcct.displaySavAccount();
return display;
}
void SavingsAccount::displaySavAccount()
{
cout << "     Savings information.     " << endl;
cout << "Interest Rate on the account is:" << interest << endl;
}
class CheckingAccount : public BankAccount
{
friend ostream& operator<<(ostream& display, const CheckingAccount& aCheckAcct);
private:
double monthlyFee;
int checksAllowed;
public:
CheckingAccount(double = 0,int = 0,int = 0,double = 0);
void displayCheckAccount();
void getCheckingInfo();
};
CheckingAccount::CheckingAccount(double fee, int allowed, int num, double bal) :      BankAccount(num,bal), monthlyFee(fee), checksAllowed(allowed)
{

}
void CheckingAccount::getCheckingInfo()
{
cout << "Enter monthly fee of the Account for the checking account. $";
cin >> monthlyFee;
cout << endl << "How many checks are allowed?" << endl;
cin >> checksAllowed;
}
ostream& operator<<(ostream& display, CheckingAccount& aCheckAcct)
{
aCheckAcct.displayCheckAccount();
return display;
}
void CheckingAccount::displayCheckAccount()
{
cout << "           Checking Information           " << endl;
BankAccount::displayAccount();
cout << "Monthly fee on the account is:$" << monthlyFee << endl;
cout << "Checks allowed for this account is: " << checksAllowed << endl;
}
class CheckingWithInterest : public SavingsAccount, public CheckingAccount
{
private:

public:
CheckingWithInterest();
void displayWithInterest();
};
CheckingWithInterest::CheckingWithInterest() : CheckingAccount(0,0,9999,0), SavingsAccount(0.03)
{}
void CheckingWithInterest::displayWithInterest()
{
CheckingAccount::displayCheckAccount();
SavingsAccount::displaySavAccount();
}
int main()
{
cout << fixed << setprecision(2);

unsigned count;
vector<SavingsAccount>savAcct;
SavingsAccount aSavAcct;
vector<CheckingAccount>checkAcct;
CheckingAccount aCheckAcct;
vector<CheckingWithInterest>withIntAcct;
CheckingWithInterest aWithIntAcct;
const char QUIT = 'n';
char quitChar = 'y';
cout << "Do you want to enter Savings Information? y or n ";
cin >> quitChar;
do
{
    aSavAcct.enterAccountData();
    aSavAcct.getSavInfo();
    savAcct.push_back(aSavAcct);
    cout << "Would you like to enter another Savings Account? y or n ";
    cin >> quitChar;
}while(quitChar != QUIT);
cout << "Do you want to enter Checking Information? y or n ";
cin >> quitChar;
do
{
    aCheckAcct.enterAccountData();
    aCheckAcct.getCheckingInfo();
    checkAcct.push_back(aCheckAcct);
    cout << "Would you like to enter another Checking Account? y or n ";
    cin >> quitChar;
}while(quitChar != QUIT);
cout << "Do you want to enter Checking with interest account Information? y or n ";
cin >> quitChar;
do
{
    aWithIntAcct.enterAccountData(); // error points here for both (Line 233)
    aWithIntAcct.getSavInfo();
    aWithIntAcct.getCheckingInfo();
    checkAcct.push_back(aWithIntAcct);
    cout << "Would you like to enter another Checking Account with interest? y or n ";
    cin >> quitChar;
}while(quitChar != QUIT);

sort(savAcct.begin(), savAcct.end());
for(count = 0; count < savAcct.size(); ++count)
{
    repeatValue(savAcct.at(count), count);
    cout << endl;
    produceReport(savAcct.size(), "Savings Account Information", savAcct.at(count));
}
sort(checkAcct.begin(), checkAcct.end());
for(count = 0; count < checkAcct.size(); ++count)
{
    repeatValue(checkAcct.at(count), count);
    cout << endl;
    produceReport(checkAcct.size(), "Checking Account Information", checkAcct.at(count));
}
sort(withIntAcct.begin(), withIntAcct.end());
for(count = 0; count < withIntAcct.size(); ++count)
{
    repeatValue(withIntAcct.at(count), count);
    cout << endl;
    produceReport(withIntAcct.size(), "Checking with interest Account Information",      withIntAcct.at(count));
}
system("pause");
return 0;
}

1 Ответ

13 голосов
/ 01 мая 2011
class BankAccount
class SavingsAccount : public BankAccount
class CheckingAccount : public BankAccount
class CheckingWithInterest : public SavingsAccount, public CheckingAccount

Эта иерархия наследования (вероятно) неверна. Прямо сейчас это выглядит так:

 BankAccount       BankAccount
      |                 |
SavingsAccount   CheckingAccount
      \                 /
      CheckingWithInterest

Таким образом, каждый CheckingWithInterest объект на самом деле имеет два подобъекта базового класса BankAccount: один из его подобъекта SavingsAccount базового класса и один из подобъекта CheckingAccount базового класса.

Итак, при попытке вызвать функцию-член BankAccount для объекта CheckingWithInterest, например,

CheckingWithInterest account;
account.enterAccountData();

компилятор не знает, имеете ли вы в виду enterAccountData() из BankAccount, который является частью SavingsAccount базового класса, или вы имеете в виду enterAccountData() из BankAccount, который является частью CheckingAccount Базовый класс.

Я не уверен, какие именно ваши требования, но если вы хотите иметь только один подобъект базового класса BankAccount, вам, вероятно, нужно использовать виртуальное наследование, когда вы выводите CheckingAccount и SavingsAccount из BankAccount, так что подобъект BankAccount разделяется между ними, когда они составлены в CheckingWithInterest:

class BankAccount
class SavingsAccount : public virtual BankAccount
class CheckingAccount : public virtual BankAccount
class CheckingWithInterest : public SavingsAccount, public CheckingAccount

Если вы действительно хотите, чтобы было два подобъекта базового класса BankAccount, то, когда вы вызываете enterAccountData(), вам необходимо указать, для какого подобъекта базового класса вы хотите вызвать функцию-член:

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