ошибка в контексте - PullRequest
4 голосов
/ 17 июня 2010

Может кто-нибудь объяснить мою ошибку, у меня есть этот класс:

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 ]

9 голосов
/ 17 июня 2010

Я полагаю, что полная ошибка связана с "Этими членами являются частные within context" и некоторыми номерами строк.

Проблема в том, что i->strFirstName является приватным с точки зрения функции reportAccounts(). Лучшее решение может быть:

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 голос
/ 17 июня 2010

Вам не хватает точки с запятой в определении класса.

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?
1 голос
/ 17 июня 2010

Вы объявляете эту функцию printAccount другом class Account.Но в этом примере вы получаете доступ к членам класса (i->strFirstName ...) в функции reportAccounts.Последний не объявлен другом.

0 голосов
/ 17 июня 2010

Это не должно быть всей ошибкой ... должно быть что-то большее ..

в том смысле, что синтаксис вашего друга кажется правильным, но в reportAccounts вы, похоже, используете все поля Account класс, который является приватным, например strFirstName, а имя функции - reportAccounts, а не printAccounts, поэтому, вероятно, вы только что подружились с методом, но пытаетесь получить доступ к приватным полям с помощью другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...