Вопрос по methods, c++, class, private-members – Можно ли вызвать метод из main, если он приватный? Если нет, то как это возможно?

-3

Я пытаюсь запустить эту программу, но в настоящее время у меня просто появляются ошибки. Я не уверен, как заставить это работать. Если я изменю класс 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;
    }

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

возможный дубликатФункции друзей в C ++ iammilind
Я понимаю, что в течение дня намного больше отрицательных голосов, чем ночью. user1781382
Подумайте о часовых поясах и о том, где может проживать большая часть пользователей SO ;-) Rook

Ваш Ответ

4   ответа
0

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

    ...

    return 0;
}

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

Нет необходимости голосовать за меня. Я идентифицировал явную проблему с кодом. Я исправил это, чтобы показать, что да, методы, которые он хочет вызвать, должны быть открытыми. ScoPi
И отлично, он просто отредактировал код, чтобы исправить проблему, которую я обнаружил, ничего не сказав. ScoPi
Он также должен будет правильно указать, какие части SavingAccount являются общедоступными, а какие - частными. The Forest And The Trees
Это был не я! Я так же смущен, как и вы. The Forest And The Trees
Ха! Сожалею. Благодарю. ScoPi
3

поэтому вы всегда можете добавить их в общий доступ следующим образом:

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

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

Это был хороший совет. user1781382
Однако это не принципиальная проблема. Основная проблема заключается в том, что он пытается использовать методы класса, не имея экземпляра класса. ScoPi
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

и поскольку он запрещает доступ к его членам (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 ISOSavingsAccount:

SavingsAccount savingsAccount;
Account& account = savingsAccount;

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

Похожие вопросы