上下文中的错误

时间:2010-06-17 14:35:33

标签: c++ class oop

有人可以解释我的错误,我有这个课程:

class Account
{
private:
    string strLastName;     
    string strFirstName;    
    int nID;              
    int nLines;             
    double lastBill;
public:
    Account(string firstName, string lastName, int id);
    friend string printAccount(string firstName, string lastName, int id, int lines, double lastBill);
}

但是当我打电话时:

string reportAccounts() const
{
    string report(printAccountsHeader());
    for(list<Account>::const_iterator i = listOfAccounts.begin(); i != listOfAccounts.end(); ++i)
    {
        report += printAccount(i->strFirstName, i->strLastName, i->nID, i->nLines, i->lastBill);;
    }
        return report;
}

我收到错误within context,有人可以解释原因吗?

4 个答案:

答案 0 :(得分:9)

我认为完整错误与“这些成员是私有within context”和某些行号有关。

问题是i->strFirstNamereportAccounts()函数的角度来看是私有的。更好的解决方案可能是:

class Account{
    private:
        string strLastName;     
        string strFirstName;    
        int nID;              
        int nLines;             
        double lastBill;
    public:
        Account(string firstName, string lastName, int id);
        string print() const
        {
           return printAccount(this->strLastName, this->strFirstName, this->nID,
              this->nLines, this->lastBill);
        }
};

然后

string reportAccounts() const {
    string report(printAccountsHeader());
    for(list<Account>::const_iterator i = listOfAccounts.begin(); i != listOfAccounts.end(); ++i){
        report += i->print();
    }
    return report;
}

另一个选择是让printAccount引用一个帐户(friend printAccount(const Account& account)),然后它可以通过引用访问私有变量。

但是,该函数名为print Account 这一事实表明它可能更适合作为公共类函数。

答案 1 :(得分:1)

您声明函数printAccountclass Account的朋友。但是在该示例中,您正在访问函数i->strFirstName中的类成员(reportAccounts ...)。后者未被宣布为朋友。

答案 2 :(得分:1)

您在类定义中缺少分号。

class Account{
    private:
        string strLastName;     
        string strFirstName;    
        int nID;              
        int nLines;             
        double lastBill;
    public:
        Account(string firstName, string lastName, int id);
    friend string printAccount(string firstName, string lastName, int id, int lines, double lastBill);
};
 ^--- see the semicolon here?

答案 3 :(得分:0)

这不应该是整个错误..应该有更多的东西..

顺便说一下你的朋友语法是正确的,但在reportAccounts中你似乎使用了Account类的所有私有字段,如strFirstName,函数的名称是reportAccounts不是printAccounts所以你可能只是做了一个方法朋友,但是你正试图用另一个访问私有字段。