2010-07-22 97 views
12

我的問題是關於朋友的功能,以及超載< <和>>。根據我的理解,我認爲朋友功能可以(也應該)直接訪問私有成員變量。但是,在這裏我只有在使用「get」函數獲取每個私有變量時,編譯器纔會接受我的.cxx文件。C++的朋友功能 - 運營商超載istream >>

這裏是我的頭文件

class BigNum 
public: 

// CONSTRUCTORS and DESTRUCTORS 
    BigNum();        
    BigNum(int num, size_t optional_base = 10);       
    BigNum(const char strin[], size_t optional_base = 10); 

// MEMBER FUNCTIONS 
    size_t get_digit(size_t index) const; 
    size_t get_used() const; 
    size_t get_capacity() const; 
    size_t get_base() const; 
    bool get_sign() const; 

// FRIEND FUNCTIONS 
    friend std::ostream& operator<<(std::ostream &os, const BigNum &bignum); 
    friend std::istream& operator>>(std::istream &is, BigNum &bignum); 

private: 
    size_t base;    
    size_t *digits;   
    bool positive;   
    size_t used;    

這是我與相對應的朋友的實現.CXX文件功能

#include "file.h" 
#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 

std::ostream& operator <<(std::ostream &os, const BigNum &bignum) 
{ 
if (bignum.get_sign() == false) 
    os << '-'; 

for (size_t i = 0; i < bignum.get_used(); ++i) 
    os << bignum.get_digit(bignum.get_used() - i - 1); 

return os; 
} 

std::istream& operator >>(std::istream &is, BigNum &bignum) 
{ 
for (size_t i = 0; i < bignum.get_used(); ++i) 
    is >> bignum.digits[i]; 

return is; 
} 

所以在這方面的上述朋友運營商正確編譯。然而,爲什麼我的操作員>>可以直接訪問一個私有變量(是>> bignum.digits [i]),但其餘的私有變量需要通過'獲取函數'檢索

下面,當我嘗試寫超負荷運營商在這方面的(我怎麼想的朋友職能應該正確地調用私有變量):

std::ostream& operator <<(std::ostream &os, const BigNum &bignum) 
{ 
if (bignum.positive == false) 
    os << '-'; 

for (size_t i = 0; i < bignum.used; ++i) 
    os << bignum.digits[used - i - 1]; 

return os; 
} 

std::istream& operator >>(std::istream &is, BigNum &bignum) 
{ 
for (size_t i = 0; i < bignum.used); ++i) 
    is >> bignum.digits[i]; 

return is; 
} 

我得到以下錯誤。

BigNum2.cxx: In function `std::ostream& 
    csci2270_hw1B::operator<<(std::ostream&, const csci2270_hw1B::BigNum&)': 
BigNum2.cxx:201: error: `used' undeclared (first use this function) 
BigNum2.cxx:201: error: (Each undeclared identifier is reported only once for 
    each function it appears in.) 
BigNum2.cxx: In function `std::istream& 
    csci2270_hw1B::operator>>(std::istream&, csci2270_hw1B::BigNum&)': 
BigNum2.cxx:208: error: syntax error before `)' token 

我使用的編譯器是g ++(版本3.3.1)。任何幫助表示讚賞,謝謝。

修訂:

我更新的代碼,以便BIGNUM對象可以訪問私有變量。我給朋友操作員做了以下操作,超載< <,它編譯得很好。感謝評論,這是一個新手的錯誤。

std::ostream& operator <<(std::ostream &os, const BigNum &bignum) 
{ 
if (bignum.positive == false) 
    os << '-'; 

for (size_t i = 0; i < bignum.used; ++i) 
    os << bignum.digits[bignum.used - i - 1]; 

return os; 
} 

爲>>操作

BigNum2.cxx但是編譯器仍然產生錯誤:在功能std::istream& csci2270_hw1B::operator>>(std::istream&, csci2270_hw1B::BigNum&)': BigNum2.cxx:208: error: syntax error before)」令牌

的>>應該在數量和私人閱讀成員變量'used'應該記錄數組的長度。我仍然對爲什麼編譯器接受

std::istream& operator >>(std::istream &is, BigNum &bignum) 
{ 
for (size_t i = 0; i < bignum.get_used()); ++i) 
    is >> bignum.digits[i]; 

return is; 
} 

有些困惑,而不是:

std::istream& operator >>(std::istream &is, BigNum &bignum) 
{ 
for (size_t i = 0; i < bignum.used); ++i) 
    is >> bignum.digits[i]; 

return is; 
} 

有什麼想法?謝謝。

+1

什麼是'「file.h」'? – GManNickG 2010-07-22 18:51:59

回答

9

友元函數可以訪問類的私有數據,但它得到this指針做出自動的,所以每次訪問類的數據(私有或以其他方式)必須是合格。例如這樣的:

os << bignum.digits[used - i - 1]; 

需求是:

os << bignum.digits[bignum.used - i - 1]; 
+0

謝謝,那修正了<<運算符 – user399415 2010-07-22 19:52:41

5

您尚未在第一個功能中認定used - 它需要爲bignum.used。運算符重載是在全局範圍內定義的,所以它們不會得到指針this。但是,朋友功能確實可以訪問班級的私人成員。

std::ostream& operator <<(std::ostream &os, const BigNum &bignum) 
{ 
    if (bignum.positive == false) 
     os << '-'; 

    for (size_t i = 0; i < bignum.used; ++i) 
     // Note "bignum.used", instead of "used". 
     os << bignum.digits[bignum.used - i - 1];  
    return os; 
} 

std::istream& operator >>(std::istream &is, BigNum &bignum) 
{ 
    for (size_t i = 0; i < bignum.used; ++i) 
     is >> bignum.digits[i]; 

    return is; 
} 
2

似乎有以下行的額外 ')' bignum.used之後。

for (size_t i = 0; i < bignum.used**)**; ++i)