2010-07-22 5 views
12

Мой вопрос касается функций друга, а также для перегрузки < < и >>. По моему мнению, я думал, что функции друга могут (и должны) напрямую обращаться к частным переменным-членам. Однако в том случае, когда я здесь, компилятор принимает только мой .cxx-файл, когда я использовал функции «get» для получения каждой частной переменной.C++ friend function - перегрузка оператора istream >>

Вот мой файл заголовка

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]), но остальные частные переменные должны быть получены с помощью функции «получить функции»

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

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

в противоположность:

std::istream& operator >>(std::istream &is, BigNum &bignum) 
{ 
for (size_t i = 0; i < bignum.used); ++i) 
    is >> bignum.digits[i]; 

return is; 
} 

Любые мысли? Благодарю.

+1

Что такое '' file.h "'? – GManNickG

ответ

9

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

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

должно быть:

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

спасибо, что исправил оператор << – user399415

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

Кажется, есть дополнительный ')' в следующей строке сразу после bignum.used.

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