Newsgroup: it.comp.lang.c++
Titolo: aiuto std

ho trovato questa classe nel ng:
#include <iostream>
#include <string>
using namespace std;
class mia
{
        int _colore,_lato;
        double _rotazione;
        string _nome;
        public:
        mia() : _nome("NULL"),_lato(0),_colore(0),_rotazione(0.0) {}
  [cut] 
        }
        friend ostream& operator<<(ostream& os, const mia& M)
        {
                return os << M._nome << " " << M._lato << " " <<
M._colore
                        << " " << M._rotazione;
        }
        friend istream& operator>>(istream& is, mia& M)
        {
                return is >> M._nome >> M._lato >> M._colore >>
M._rotazione;
        }
};
poniamo il caso che questo si un header e volessi definire le due
funzioni friend in un .cpp
quindi scrivo:
#include "mia.h"
std::ostream& operator<<(std::ostream& os, const mia& M)
        {
                return os << M._nome << " " << M._lato << " " <<
M._colore
                        << " " << M._rotazione;
        }
std::istream& operator>>(std::istream& is, mia& M)
        {
                return is >> M._nome >> M._lato >> M._colore >>
M._rotazione;
        }
ma così facendo mi dà errore 
  binary '>>' : no operator defined which takes a right-hand operand
of type 'int' (or there is no acceptable conversion)
come fare per fargli prendere l'int? eanche il double

 funzioni friend in un .cpp
OK definire le funzioni friend in .cpp, ma hai *dichiarato* tali 
funzioni nell'header?? [Cioe', nell'header devi mettere solo il 
prototipo, nel .cpp l'intera definizione della funzione.]
Dan

ok, la riscrivo
//file mia.h
#include <iostream>
#include <string>
using namespace std;
class mia
{
int _colore;
char _rotazione;
string _nome;
public:
mia() : _nome("NULL"),_lato(0),_colore(0),_rotazione(0.0) {} 
int Colore(){return _colore;}
string Nome(){return _nome;}
char Rotazione{return _rotazione;}
friend std::ostream& operator<<(ostream& os, const mia& M);
friend std::istream& operator>>(istream& is, mia& M);
};
//file mia.cpp
#include "mia.h"
std::ostream& operator<<(std::ostream& os, const mia& M)
{
return os << M.Nome() << " "  <<M.Colore()<< " " << M.Rotazione();
}
std::istream& operator>>(std::istream& is, mia& M)
{
return is >> M.Nome() >> M.Lato()>>M.Rotazione();
}
mi dà errore 
binary '>>' : no operator defined which takes a right-hand operand
of type 'int' (or there is no acceptable conversion)


 }
No, devi fare:
is >> M._nome 
ecc.
Dan

 ecc.
Oppure devi dare in overload anche metodi del tipo:
// Nota il reference e il fatto che sia *non* const
int & mia::Nome() {
  return _nome;
}
allora credo che potrebbe andare bene anche
return is >> M.Nome() ecc.
Pero', a questo, punto, se dagli operator << e >> non accedi 
direttamente ai dati private/protected della tua classe, perche' li 
definisci friend?
<Nota_Personale>
Io ho un po' l'impressione che tu vada un po' "a tentoni" col C++ [senza 
offesa, naturalmente!]...ti consiglieri prima di rafforzare bene i 
concetti di reference, metodi const e non const, ecc. prima di 
avventurarti nello sviluppo :)
</Nota_Personale>
Ciao,
Dan

 
 allora mi dovresti spiegare perchè mi dà questo errore '_nome' :
cannot access private member declared in class 'mia' ,(naturalmente lo
fa anche su colore etc.)
Forse perchè la direttiva using namespace std; nell'header mia.h
produce strani effetti?
//file mia.h
#include <iostream>
#include <string>
using namespace std;
class mia
{
 friend istream& operator>>(istream& is, mia& M);
 friend ostream& operator<<(ostream& os, mia& M);  
public:
	mia() : _nome("NULL"),_colore(0) { } 
 
private:
   int _colore;
   char _rotazione;
   string _nome;
};
//mia.cpp
#include "mia.h"
ostream& operator<<(ostream& os, mia& M)
 {
  return os << M._nome<< " " <<M._colore << " " << M._rotazione;		  
 }
istream& operator >> ( istream& is, mia& M)
 {
   return is >> M._nome>> M._colore >>M._rotazione;
 }

 fa anche su colore etc.)
A me compila senza problemi...