Provo a spiegarmi.
Questo il è file compito.h che avevo scritto:
// compito.h
#include <iostream>
#include <cstring>
using namespace std;
class Display {
int row;
int col;
int cur;
char** dis;
public:
Display(int,int);
Display(const Display&);
friend ostream& operator<<(ostream& , const Display& );
};
// compito.cpp
#include <iostream>
#include <cstring>
#include "compito.h"
using namespace std;
Display::Display(int L, int C)
{
if (L<1 || C<1) {
row=5;
col=8;
}
else {
row=L;
col=C;
}
cur=0;
int r,c;
dis=new char*[row];
for(r=0; r<row; r++)
dis[r]=new char[C+1];
for(r=0; r<L; r++)
for(c=0; c<=C; c++)
dis[r][c]='\n';
}
ostream& operator<<(ostream& os, const Display& dd)
{
int r,c;
for(r=0; r<(dd.row); r++)
// {
// os << "["<< r;
// if (r==dd.cur && c==0)
// os << ">";
// os << dd.dis[r][c] << "]";
// for(c=0; c<dd.col; c++)
// if (dd.dis[r][c]!='') os << dd.dis[r];
// os << endl;
// }
return os;
}
Non è semplice ricostruire il percorso che ho fatto ma dovrebbe essere piuttosto attendibile quello che ho scritto.
Avevo commentato tutte le righe della funzione operator per cercare di trovare l'errore, il compilatore diceva che l'attributo
row era privato e non poteva essere acceduto( come se la funzione non fosse friend). Ho provato anche a spostare la funzione friend nella parte privata della classe ma il risultato era lo stesso.
L'unico modo è stato invertire due direttive include, quella con compito.h era scritta per prima.
Comunque ho riprodotto il problema anche a casa ma non ho avuto lo stesso comportamento, cioè il compilatore non dava errore sull'accesso all'attributo row. Rimane un enigma!
A questo punto mi chiedo se nel main.cpp è corretto inserire soltanto :
#include "compito.h"
visto che le altre direttive sono già nel file .h, sbaglio?