Newsgroup: it.comp.lang.c++
Titolo: friend non funziona

Salve a tutti comincio con il dire che sono un principiante in
programmazione, quindi scusatemi se qualcosa può sembrare banale.
Uso Microsoft Visual C++ 6.0 Enterprice.
// integerSet.h
#ifndef INTEGERSET_H
#define INTEGERSET_H
using namespace std;
class IntegerSet{
     friend ostream &operator<<(ostream & , const IntegerSet & );
     friend istream &operator>>(istream & , IntegerSet & );
public:
     IntegerSet(const int =-1, const int =-1, const int =-1, const int =-1,
const int =-1); // costruttore di default
    ..............(altri metodi)
private:
     enum {SIZE=101}; // 101 dato che gli elementi devono essere da 0 a 100
     int interi[SIZE];
};
#endif
questa è la definizione di classe
// integerSet.cpp
#include <iostream>
#include <iomanip>
#include "integerSet.h"
using namespace std;
IntegerSet::IntegerSet(const int a, const int b, const int c, const int d,
const int e){
............
ostream &operator<<(ostream &output, const IntegerSet &a){
     a.setPrint();
     output<<"Ho usato l'operatore << overloadato!"<<endl;
     return output;
} // *end operator<<*
istream &operator>>(istream &input, IntegerSet &a){
     for(int i=0; i<SIZE; i++){
      input>>a.interi[i]; // non mi convince
     }
     return input;
} // *end operator>>*
C:\Riccardo\Programmi in C++\n.d.-5a-1 (classe IntegerSet)
2\integerSet.cpp(127) : error C2065: 'SIZE' : undeclared identifier
C:\Riccardo\Programmi in C++\n.d.-5a-1 (classe IntegerSet)
2\integerSet.cpp(128) : error C2248: 'interi' : cannot access private member
declared in class 'IntegerSet'
        c:\riccardo\programmi in c++\n.d.-5a-1 (classe integerset)
2\integerset.h(26) : see declaration of 'interi'
perché mi dice che non ci posso accedere???
Dove sbaglio???
Può essere che devo settare qualcosa nel compilatore?
Grazie per avermi dedicato il vostro tempo
RicK

 
Scusami se non rispondo direttamente alla tua domanda, ma perchè stai 
facendo questa classe ?
Se hai bisogno di un set di interi (cioè un insieme di interi) puoi 
banalmente usare std::set<int>
Se questa non ti va bene perchè è troppo lenta e sei sicuro che gli 
interi sono compresi tra 0 e 100, puoi usare un array di bool
bool interi[SIZE]
che indica se l'intero in indice è presente o meno nell'insieme.
Se invece il problema più importate è poter scrivere e leggere (più 
difficile) da stream...
Comunque per il 'friend' prova a mettere i prototipi delle due funzioni 
nel .h prima della dichiarazione della classe, ancora prima la 
dichiarazione del tipo:
class IntegerSet;
Anche in questo caso c'è una soluzione più elegante che non usa 
'friend': dichiara in IntegerSet due funzioni pubbliche di 
serializzazione che vengono chiamate dalle funzioni operator globali.

 
Sistema innanzi tutto l'errore alla riga 127: a.SIZE e non SIZE
Se usi i precompiler header aggiungi in testa al cpp l'include per 
StdAfx.h.
Io ho provato e non ho avuto problemi nella compilazione. Non e' che per 
caso hai dimenticato ci chiudere qualche parentesi graffa o cose di 
questo tipo?
Ciao.
-Ema-

 questo tipo?
No sono sicuro
Grazie

RicK wrote:

Ho preso il tuo codice, l'ho buttato in due files (uno .h e l'altro 
.cpp) ed ho compilato. Mi ha dato l'errore sul SIZE e l'ho corretto. 
L'ho ricompilato ed ha funzionato. MSVC 6.0 enterprise edition. Ci 
dev'essere qualcosa che non va nel codice che non hai postato o nelle 
librerie che usi o ...boh. Hai solo questi errori o ne hai degli altri?
Ciao.
  -Ema-