друг C++ функция - оператор, перегружающийся istream>>

Моим вопросом являются в отношении друга функции, а также перегрузка <<и>>. От моего понимания я думал друг, функции могли (и если) переменные члена парламента, не занимающего официального поста доступа непосредственно. Однако в случае у меня есть здесь компилятор, только принял бы мой .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 [я]), но остальная часть частных переменных должна быть получена, 'получают функции'

Ниже, когда я пытаюсь записать операторы перегрузки в этом отношении (как я думал друг, которого функции должны правильно назвать частными переменными):

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). Любая справка ценится, спасибо.

Пересмотренный:

Я обновил код, таким образом, объект сверхбольшого числа мог получить доступ к частным переменным. Я сделал следующее другу перегрузка оператора <<, и она скомпилировала прекрасный. Спасибо за комментарии, который был ошибкой новичка.

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: error: syntax error before)' маркер

>>, как предполагается, читает в числе, и 'используемая' переменная члена парламента, не занимающего официального поста, как предполагается, записывает длину массива. Я все еще несколько смущен на том, почему компилятор принимает

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

Какие-либо мысли?спасибо.

12
задан user399415 22 July 2010 в 19:25
поделиться

2 ответа

Дружественная функция имеет доступ к приватным данным класса, но она не получает указатель this, чтобы сделать это автоматическим, поэтому каждый доступ к данным класса (приватным или иным) должен быть квалифицирован. Например, this:

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

должен быть:

os << bignum.digits[bignum.used - i - 1];
9
ответ дан 2 December 2019 в 20:15
поделиться

Вы не квалифицировали использовали в первой функции - это должно быть 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; 
} 
5
ответ дан 2 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: