2010-07-22 26 views
12

Sorum şu anda arkadaşlık fonksiyonları ile ilgili olarak < < ve >>. Anlayışımdan, arkadaş fonksiyonlarının doğrudan özel üye değişkenlerine erişebildiğini (ve yapması gerektiğini) düşündüm. Ancak burada sahip olduğum durumda, derleyici, her özel değişkeni elde etmek için "get" işlevlerini kullandığımda yalnızca .cxx dosyasını kabul ederdi.C++ arkadaş fonksiyonu - operatör aşırı yükleme istream >>

İşte benim başlık dosyası İşte

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;    

olduğu arkadaş uygulamaları ile benim tekabül .CXX dosya yukarıdaki arkadaş operatörleri doğru derlenmiş bu konuda

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

Yani çalışır. Ancak neden benim operatör >> doğrudan bir özel değişkeni erişebilmeleri öyle (>> olduğu bignum.digits [i]), ancak özel değişkenlerin kalanı 'olsun işlevleri' Aşağıda

, zaman tarafından erişime ihtiyaç duyulan Ben (Ben arkadaş düzgün özel değişkenleri çağırmalıdır düşünce nasıl) bu konuda aşırı yük operatörleri yazmayı deneyin: Ben şu hataları elde

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 

kullanıyorum derleyici ++ (Versiyon 3.3.1) gramdır. Herhangi bir yardım takdir, teşekkür ederim.

Revize: bignum nesne özel değişkenlere erişmek böylece

Ben kodu güncellendi. < <'u aşırı yükleyen arkadaş operatörüne aşağıdakileri yaptım ve iyi bir şekilde derledim. Yorumlarınız için teşekkürler, bu bir çaylak hatasıydı. >> operatörü

BigNum2.cxx için

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

Ancak derleyici hala üretiyor hataları: belirteç fonksiyonu std::istream& csci2270_hw1B::operator>>(std::istream&, csci2270_hw1B::BigNum&)': BigNum2.cxx:208: error: syntax error before)'

>> Bir sayı ve özel olarak okumak gerekiyordu 'kullanılan' üye değişkeni dizinin uzunluğunu kaydetmesi gerekiyor.

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

return is; 
} 

Herhangi düşünceler: aksine ben hala derleyici

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

return is; 
} 

kabul neden biraz karıştı? Teşekkürler.

+1

'" file.h "' nedir? – GManNickG

cevap

9

Bir arkadaşım işlevi sınıfına erişimi olan özel veriler, ancak sınıfının bu otomatik, yani her erişimi yapmak için bir this işaretçi alamadım yapar veri (aksi özel veya) olmak zorundadır nitelikli.Örneğin Bunun için:

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

ihtiyacı olması: O şu satırına ')' ekstra hemen sonra bignum.used var gibi görünüyor

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

teşekkürler, bu << operatörünü düzeltti – user399415

5

İlk işlevde used kalifiye olmadınız - bignum.used olması gerekiyor. Operatör aşırı yükleri global kapsamda tanımlanmıştır, bu nedenle this işaretçisi alamazlar. Bununla birlikte, arkadaş fonksiyonları sınıfın özel üyelerine erişebilir.

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

.

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