-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;
    }

助言がありますか?

4

4 に答える 4

3

デフォルトでは、メンバー関数はプライベートであるため、次のようにいつでもパブリックに追加できます。

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

これで、メインからそれらを呼び出すことができるようになります。

于 2012-11-19T13:54:23.817 に答える
1

SavingsAccountクラスは変更できず、そのメンバーへのアクセスが禁止されているため(privateデフォルト)、そのクラスのメンバーを使用することは想定されていません。

「問題は主な機能にあります」:いいえ、それはクラスの設計にあります。公開されていないクラスは役に立ちません。

あなたの問題に対する明確な解決策はありません。

クラス変更の境界線上の解決策は、「インターフェース」を定義し、(変更されていない)クラスにそのインターフェースを継承させることです。

class Account {
public:
   virtual ~Account(){}
   virtual void Information() = 0;
   virtual double AccountClosureLoss() = 0;
   virtual void OutputInformation() = 0;
};


class SavingsAccout : public Account {
... body remains unchanged
};

isomainを使用します:AccountSavingsAccount

SavingsAccount savingsAccount;
Account& account = savingsAccount;

// should be accessible via the `Account` interface.
account.AccountClosureLoss(); 
于 2012-11-19T13:57:43.450 に答える
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;
};

インスタンスなしでメソッドを使用することはできません。たとえ可能であったとしても(おそらく静的ですか?)、それらの内部でメンバー属性を使用することはできないので、それをクラスに含めることは無意味です。

于 2012-11-19T14:06:30.293 に答える
0

最初にSavingsAccountクラスのインスタンスを宣言する必要があります。例えば:

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

    ...

    return 0;
}

さらに、はい、呼び出すクラスのメソッドはパブリックである必要があります。

于 2012-11-19T13:53:55.440 に答える