c++ 友元函数 - 运算符重载 istream >>

标签 c++ operator-overloading friend operator-keyword

我的问题是关于友元函数以及重载 << 和 >>。据我了解,我认为友元函数可以(并且应该)直接访问私有(private)成员变量。但是在我在这里的情况下,当我使用“get”函数获取每个私有(private)变量时,编译器只会接受我的 .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;
}

所以在这方面上面的友元运算符编译正确。但是为什么我的运算符>>可以直接访问一个私有(private)变量(是>> bignum.digits [i]),而其余的私有(private)变量需要通过'get functions'检索

下面,当我尝试在这方面编写重载运算符时(我认为 friend 函数应该如何正确调用私有(private)变量):

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 对象可以访问私有(private)变量。我对重载 << 的 friend 运算符做了以下操作,它编译得很好。感谢您的评论,这是一个菜鸟的错误。

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: 错误:)' 标记之前的语法错误

>>应该读入一个数字,私有(private)成员变量'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;
}

有什么想法吗?谢谢。

最佳答案

友元函数可以访问类的私有(private)数据,但它确实没有得到一个 this 指针来将调用与类的特定实例相关联,所以对类(class)数据(私有(private)或其他)的每次访问都必须经过限定。例如:

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

需要:

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

关于c++ 友元函数 - 运算符重载 istream >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312269/

相关文章:

c++ - 变量等末尾的和号 (&)

c++ - C++ 中的友元方法 "not declared in this scope"

c++ - 结交类(class) friend

c++ - 生成文件 : "ignoring #pragma omp parallel" 的 openmp 问题

c++ - 重载 [] 但其结果在与其他运算符交互之前未解析 (c++)

c++ - 在 C++11 中使用偏特化

c++ - 为什么是 "dumb to override the & operator and return *this*"?

c++ - 如何重载条件运算符?

c++ - 优化 Mat Channels 的 OR

c++ - 尝试将右值传递给元组时错误使用已删除函数