c ++ friend function - 运算符重载istream>>

时间:2010-07-22 18:48:01

标签: 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;              

这是我对应的.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;
}

所以在这方面上面的朋友运营商编译正确。但是为什么我的运营商&gt;&gt;可以直接访问一个私有变量(&gt;&gt;&gt; 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;
}

我收到以下错误。

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对象可以访问私有变量。我对friend运算符重载&lt;&lt;执行了以下操作:它编译得很好。感谢您的评论,这是一个新手的错误。

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;
}

然而,编译器仍然会为&gt;&gt;产生错误操作

BigNum2.cxx:在函数std::istream& csci2270_hw1B::operator>>(std::istream&, csci2270_hw1B::BigNum&)': BigNum2.cxx:208: error: syntax error before)'标记

&gt;&gt;应该读取一个数字,私有成员变量'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;
}

有什么想法?感谢。

3 个答案:

答案 0 :(得分:9)

友元函数可以访问类的私有数据,但获取this指针以使其自动生成,因此每次访问类的数据(私有或私有)否则)必须合格。例如:

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

需要:

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

答案 1 :(得分: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 :(得分:2)

似乎在bignum.used之后的下一行中有一个额外的')'。

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