Можно ли вызвать метод из main, если он приватный? Если нет, то как это возможно?

Я пытаюсь запустить эту программу, но в настоящее время у меня просто появляются ошибки. Я не уверен, как заставить это работать. Если я изменю класс SavingsAccount на public, все должно быть в порядке, но я должен сохранить его как есть.

Проблема в основной функции.

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

class SavingsAccount
{
int accountType;
string ownerName;
long ssn;
double accountClosurePenaltyPercent, accountBalance;
void Information();
inline double AccountClosureLoss()
{
return (accountBalance * accountClosurePenaltyPercent);
}
void OutputInformation();

};

void SavingsAccount::Information()
{
cout << "Enter Account Type (1 for Checking or 2 for Savings): ";
cin >> accountType;
cout << "Enter owner name: ";
getline(cin, ownerName);
cout << "Enter the Social Security Number: ";
cin >> ssn;
cout << "Enter the percent penalty for closing account(decimal form): ";
cin >> accountClosurePenaltyPercent;
cout << "Enter the account balance: ";
cin >> accountBalance;
}

void SavingsAccount::OutputInformation()
{
cout << "Account Type: " << endl;
cout << "Name: " << ownerName << endl;
cout << "SSN: " << ssn << endl;
cout << "Account Closure Penaly %: " << accountClosurePenaltyPercent << endl;
cout << "Account Balance: " << accountBalance;
}

int main(void)
{
SavingsAccount.Information();
SavingsAccount.AccountClosureLoss();
SavingsAccount.OutputInformation();
return 0;
}

Что я пробовал до сих пор.

int main(void)
{
SavingsAccount John;
John.Information();
John.AccountClosureLoss();
John.OutputInformation();
return 0;
}

Какие-либо предложения?

-3

Решение

По умолчанию функции-члены являются закрытыми, поэтому вы всегда можете добавить их в public следующим образом:

class SavingsAccount
{
private:
int accountType;
string ownerName;
long ssn;
public:
double accountClosurePenaltyPercent, accountBalance;
void Information();
inline double AccountClosureLoss()
{
return (accountBalance * accountClosurePenaltyPercent);
}
void OutputInformation();
};

Теперь вы сможете звонить им с основного.

3

Другие решения

Поскольку вы не можете изменить класс SavingsAccount, и поскольку он запрещает доступ к его членам (private по умолчанию), вы не должны использовать menber этого класса.

«Проблема в главной функции»: нет, это в дизайне вашего класса. Класс, не имеющий ничего общего, бесполезен.

Нет чистого решения вашей проблемы.

Решением на границе изменения класса было бы определение «интерфейса» и обеспечение того, чтобы (неизменный) класс наследовал этот интерфейс:

class Account {
public:
virtual ~Account(){}
virtual void Information() = 0;
virtual double AccountClosureLoss() = 0;
virtual void OutputInformation() = 0;
};class SavingsAccout : public Account {
... body remains unchanged
};

main буду использовать Account ISO SavingsAccount:

SavingsAccount savingsAccount;
Account& account = savingsAccount;

// should be accessible via the `Account` interface.
account.AccountClosureLoss();
1

Вы пытаетесь использовать атрибуты-члены внутри ваших методов, но вы пытаетесь использовать свои методы без экземпляра. Все значения атрибутов-членов хранятся в ваших экземплярах, поэтому сначала вам нужен экземпляр. Добавьте его в свою основную функцию:

int main(void)
{
SavingsAccount myAccount;
myAccount.Information();
myAccount.AccountClosureLoss();
myAccount.OutputInformation();
return 0;
}

Также ваши методы определены как частные, вы всегда должны использовать public: а также private: следующим образом:

class SavingsAccount
{
public:
void Information();
inline double AccountClosureLoss()
{
return (accountBalance * accountClosurePenaltyPercent);
}
void OutputInformation();

private:
int accountType;
string ownerName;
long ssn;
double accountClosurePenaltyPercent;
double accountBalance;
};

Вы не можете использовать методы без экземпляра. Даже если бы вы могли (возможно, статически?), Вы не могли бы использовать внутри них какие-либо атрибуты-члены, поэтому было бы бесполезно включать их в класс.

1

Сначала вы должны объявить экземпляр класса SavingsAccount. Например:

int main()
{
SavingsAccount account;
account.Information();

...

return 0;
}

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

0
По вопросам рекламы [email protected]