这是我的头文件
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]),但是其余的私有变量需要通过’get函数’检索
下面,当我尝试在这方面编写重载 *** 作符(我以为朋友的功能如何正确地调用私有变量):
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:错误:之前的语法错误)’标记
>>应该读取一个数字,私有成员变量’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;}
有什么想法吗?谢谢.
解决方法 一个朋友函数可以访问类的私有数据,但是它没有得到这样的一点,使其自动化,所以对类数据(私有或其他)的每次访问都必须被限定.例如:os << bignum.digits[used - i - 1];
需要是:
os << bignum.digits[bignum.used - i - 1];总结
以上是内存溢出为你收集整理的c friend函数 – *** 作符重载istream >>全部内容,希望文章能够帮你解决c friend函数 – *** 作符重载istream >>所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)