如果它是私有的,可以从main调用一个方法吗?如果没有,怎么可能?

时间:2012-11-19 13:51:09

标签: c++ class methods private-members

我想让这个程序开始运行,但目前我只是得到错误。我不知道如何让它发挥作用。如果我将类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 个答案:

答案 0 :(得分:3)

默认情况下,成员函数是私有的,因此您可以随时将它们添加到公共中:

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

您现在可以从主电话中呼叫它们了。

答案 1 :(得分: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
};

main将使用Account iso SavingsAccount

SavingsAccount savingsAccount;
Account& account = savingsAccount;

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

答案 2 :(得分: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;
};

如果没有实例,则无法使用方法。即使你可以(静态可能吗?)你也不能在其中使用任何成员属性,所以把它包含在课堂中是没用的。

答案 3 :(得分:0)

您必须先声明SavingsAccount类的实例。例如:

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

    ...

    return 0;
}

此外,是的,您要调用的类的方法必须是公共的。