我的問題是關於朋友的功能,以及超載< <和>>。根據我的理解,我認爲朋友功能可以(也應該)直接訪問私有成員變量。但是,在這裏我只有在使用「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;
}
有什麼想法?謝謝。
什麼是'「file.h」'? – GManNickG 2010-07-22 18:51:59