c friend函数 – *** 作符重载istream >>

c friend函数 –  *** 作符重载istream >>,第1张

概述我的问题是关于朋友的功能以及重载<<和>>从我的理解,我认为朋友的功能可以(并且应该)直接访问私有成员变量.但是在我这里的情况下,当我使用“get”函数来获取每个私有变量时,编译器将只接受我的.cxx文件. 这是我的头文件 class BigNum public:// CONSTRUCTORS and DESTRUCTORS BigNum(); 我的问题是关于朋友的功能以及重载<<和>>从我的理解,我认为朋友的功能可以(并且应该)直接访问私有成员变量.但是在我这里的情况下,当我使用“get”函数来获取每个私有变量时,编译器将只接受我的.cxx文件.

这是我的头文件

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 >>所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存