use*_*415 12 c++ operator-overloading friend operator-keyword
我的问题是关于朋友的功能以及重载<<和>>.根据我的理解,我认为朋友的功能可以(并且应该)直接访问私有成员变量.但是在我这里的情况下,当我使用"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;
Run Code Online (Sandbox Code Playgroud)
这是我对应的.cxx文件,其中包含friend函数的实现
#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;
}
Run Code Online (Sandbox Code Playgroud)
所以在这方面上面的朋友运营商编译正确.但是为什么我的operator >>可以直接访问一个私有变量(是>> bignum.digits [i]),但其余的私有变量需要通过'get functions'来检索
下面,当我尝试在这方面编写重载运算符时(我认为朋友函数应该如何正确调用私有变量):
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;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下错误.
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
Run Code Online (Sandbox Code Playgroud)
我使用的编译器是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;
}
Run Code Online (Sandbox Code Playgroud)
但是编译器仍然会为>>运算符生成错误
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;
}
Run Code Online (Sandbox Code Playgroud)
而不是:
std::istream& operator >>(std::istream &is, BigNum &bignum)
{
for (size_t i = 0; i < bignum.used); ++i)
is >> bignum.digits[i];
return is;
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?谢谢.
友元函数可以访问类的私有数据,但它没有获得this指向自动化的指针,因此必须限定对类数据(私有或其他)的每次访问.例如:
os << bignum.digits[used - i - 1];
Run Code Online (Sandbox Code Playgroud)
需要是:
os << bignum.digits[bignum.used - i - 1];
Run Code Online (Sandbox Code Playgroud)
你没有资格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;
}
Run Code Online (Sandbox Code Playgroud)