2010-06-17 44 views
2

可有人請解釋我的錯誤,我有這個類:範圍內的誤差

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,有人可以解釋,爲什麼?

+1

錯誤消息只是「在上下文中?」這是運行時錯誤還是編譯時錯誤?沒有其他信息? – 2010-06-17 14:39:13

+7

請留意我給你的建議[上一次](http://stackoverflow.com/questions/3048809/error-in-c-within-context),並看看錯誤信息的其餘部分。 「在上下文中」只是在編譯器輸出中出現的一行,用於*連接錯誤的另外兩部分。上面是實際的錯誤,下面是編譯器當時正在嘗試編譯的函數的名稱。脫下眼罩,看看更大的圖像。 – 2010-06-17 14:39:16

+2

-1不發佈整個錯誤。 – 2010-06-17 14:49:20

回答

8

我想象完整的錯誤有事情做了「這些成員都是私有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 帳戶的事實表明它可能更適合作爲公共類函數。

+0

非常感謝。很好的回答! – helloWorld 2010-06-17 14:53:27

1

您聲明該功能printAccountclass Account的好友。但在該示例中,您正在使用函數reportAccounts訪問該類的成員(i->strFirstName ...)。後者沒有被宣佈爲朋友。

+1

事實上,沒有理由讓printAccount成爲你寫作的朋友。如果你只是傳遞printAccount一個const Account&並讓它提取它所需的值,那更好。或者讓它成爲沒有參數的成員函數,string print()const。 – 2010-06-17 14:47:45

0

這不應該是整個錯誤..應該有更多的東西..

由您朋友的語法似乎是正確的方式,但在reportAccounts你似乎使用是私人的Account類的所有領域,如strFirstName和函數的名稱是reportAccounts而不是printAccounts所以可能你只是做了一個方法的朋友,但你試圖訪問另一個私人領域。

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?