PDA

Visualizza la versione completa : [C++] Errori nella compilazione


manu86
06-11-2007, 20:55
salve
compilando questo codice preso da un libro con visual c++mi da una serie
di errori.
Il codice il seguente:


Array.h
#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
using namespace std;

class Array
{
friend ostream &operator<<(ostream &,const Array &);
friend istream &operator>>(istream &,const Array &);
public:
Array(int=10);//costruttore di default
Array(const Array &);//costruttore di copia
~Array();//distruttore
int getSize() const;
const Array &operator=(const Array&);//operatore di assegnamento
bool operator==(const Array&) const;//operatore di eguaglianza

//operatore di disuguaglianza

bool operator!=(const Array &right){
return !((*this)==right);
}

//operatore di indicizzazzione per oggetti non costanti
int &operator[](int);
//operatore di indicizzazzione per oggetti costanti
int &operator[](int)const;
private:
int size;
int *ptr;//puntatore al primo elemento dell'array
};//fine della classe array

#endif





Array.cpp
#include <iostream>
#include <iomanip>
#include <cstdlib>//prototipo della funzione exit
using namespace std;
#include "Array.h"

//implementazione delle funzioni della classe array

//costruttore
Array::Array(int arraySize){
size=((arraySize>0)?arraySize:10);
ptr=new int[size];
for(int i=0;i<size;i++){
ptr[i]=0;
}

}//fine del costruttore

//costruttore di copia
Array::Array(const Array &arrayToCopy){
size=arrayToCopy.getSize();
ptr=new int[size];
for(int i=0;i<size;i++){
ptr[i]=arrayToCopy.ptr[i];
}
}//fine del costruttore di copia

//distruttore
Array::~Array(){
delete[] ptr;
}//fine del distruttore

//funzione che restituisce il numero di elementi del vettore
int Array::getSize()const{
return size;
}//fine della funzione getsize

//ridefinizione dell'operatore di assegnamento ;la restituzione di uoggeto const
//impedisce assegnamenti(a1=a2)=a3
const Array &Array::operator=(const Array &right){
if(&right!=this){
if(right.size!=(*this).size){
delete[] ptr;
(*this).size=right.size;
}
for(int i=0;i<size;i++){
(*this).ptr[i]=right.ptr[i];
}
}
return *this;//abilita le chiamater in cascata
}

//ridefinizione dell'operatore di eguaglianza
bool Array::operator==(const Array &right) const{
if(right.size!=((*this).size))
return false;

for(int i=0;i<size;i++){
if(((*this).ptr[i])!=right.ptr[i])
return false;
}

return true;
}
//fine della funzione operatore di eguaglianza

//implementazione della funzione che ridefinsce l'operatore
//di indicizzazzione per oggetti non costanti

int & Array::operator[](int subscript)
{
if((subscript>10) ||(subscript<=0)){
cerr<<"\nError: Subsript "<<subscript<<" is out of range."<<endl;
exit(1);
}
return ((*this).ptr[subscript]);
}
//fine della fuzione indicizzazzione per oggetti non costanti

//funzione che definisce l'operatore di iindicizzazzione per oggetti costanti

int & Array::operator[](int subscript) const{
if ((subscript>10) ||(subscript<=10)){
cerr<<"\nError: Subscript "<<subscript<<" is out of range."<<endl;
exit(1);
}
return(ptr[subscript]);
}
//fine della funzione che definisce l'operatore di indicizzazzione
//per ogeeti costanti

ostream & operator<<(ostream& output,const Array &a){
for(int i=0;i<a.size;i++)
{
output<<setw(2)<<a.ptr[i];
if((i%4)==0)
output<<endl;
}
return output;//abilita le chiamate in cascata
}

istream & operator>>(istream &input,Array &a){
for(int i=0;i<a.size;i++)
{
input>>a.ptr[i];
}
return input;//abilita le chiamate in cascata
}



Gli errori sono i seguenti:
--------------------Configuration: Array - Win32 Debug--------------------
Compiling...
Array.cpp
C:\Documents and Settings\edo1.EDO\Desktop\informatica\Array.cpp(93 ) : error C2248: 'size' : cannot access private member declared in class 'Array'
c:\documents and settings\edo1.edo\desktop\informatica\array.h(29) : see declaration of 'size'
C:\Documents and Settings\edo1.EDO\Desktop\informatica\Array.cpp(95 ) : error C2248: 'ptr' : cannot access private member declared in class 'Array'
c:\documents and settings\edo1.edo\desktop\informatica\array.h(30) : see declaration of 'ptr'
C:\Documents and Settings\edo1.EDO\Desktop\informatica\Array.cpp(10 3) : error C2248: 'size' : cannot access private member declared in class 'Array'
c:\documents and settings\edo1.edo\desktop\informatica\array.h(29) : see declaration of 'size'
C:\Documents and Settings\edo1.EDO\Desktop\informatica\Array.cpp(10 5) : error C2248: 'ptr' : cannot access private member declared in class 'Array'
c:\documents and settings\edo1.edo\desktop\informatica\array.h(30) : see declaration of 'ptr'
Error executing cl.exe.

Array.obj - 4 error(s), 0 warning(s)

come posso risolvere???

oregon
06-11-2007, 21:14
Questa

istream & operator>>(istream &input,Array &a)

deve essere

istream & operator>>(istream &input,const Array &a)

manu86
06-11-2007, 21:18
fatto...ma mi da sempre questi 4 errori

oregon
06-11-2007, 21:27
No ... non li da' ...

Controlla bene ...

manu86
06-11-2007, 21:54
probabilmente sto facendo una grande confusione...ma continua a darmi i soliti errori;
per sicurezza cmq riposto il sorgente modificato come mi hai detto


//Array100.h
#ifndef ARRAY100_H
#define ARRAY100_H
#include <iostream>
using namespace std;

class Array
{
friend ostream &operator<<(ostream &,const Array &);
friend istream &operator>>(istream &,const Array &);
public:
Array(int=10);//costruttore di default
Array(const Array &);//costruttore di copia
~Array();//distruttore
int getSize() const;
const Array &operator=(const Array&);//operatore di assegnamento
bool operator==(const Array&) const;//operatore di eguaglianza

//operatore di disuguaglianza

bool operator!=(const Array &right){
return !((*this)==right);
}

//operatore di indicizzazzione per oggetti non costanti
int &operator[](int);
//operatore di indicizzazzione per oggetti costanti
int &operator[](int)const;
private:
int size;
int *ptr;//puntatore al primo elemento dell'array
};//fine della classe array

#endif






//Array100.cpp
#include <iostream>
#include <iomanip>
#include <cstdlib>//prototipo della funzione exit
using namespace std;
#include "Array100.h"

//implementazione delle funzioni della classe array

//costruttore
Array::Array(int arraySize){
size=((arraySize>0)?arraySize:10);
ptr=new int[size];
for(int i=0;i<size;i++){
ptr[i]=0;
}

}//fine del costruttore

//costruttore di copia
Array::Array(const Array &arrayToCopy){
size=arrayToCopy.getSize();
ptr=new int[size];
for(int i=0;i<size;i++){
ptr[i]=arrayToCopy.ptr[i];
}
}//fine del costruttore di copia

//distruttore
Array::~Array(){
delete[] ptr;
}//fine del distruttore

//funzione che restituisce il numero di elementi del vettore
int Array::getSize()const{
return size;
}//fine della funzione getsize

//ridefinizione dell'operatore di assegnamento ;la restituzione di uoggeto const
//impedisce assegnamenti(a1=a2)=a3
const Array &Array::operator=(const Array &right){
if(&right!=this){
if(right.size!=(*this).size){
delete[] ptr;
(*this).size=right.size;
}
for(int i=0;i<size;i++){
(*this).ptr[i]=right.ptr[i];
}
}
return *this;//abilita le chiamater in cascata
}

//ridefinizione dell'operatore di eguaglianza
bool Array::operator==(const Array &right) const{
if(right.size!=((*this).size))
return false;

for(int i=0;i<size;i++){
if(((*this).ptr[i])!=right.ptr[i])
return false;
}

return true;
}
//fine della funzione operatore di eguaglianza

//implementazione della funzione che ridefinsce l'operatore
//di indicizzazzione per oggetti non costanti

int & Array::operator[](int subscript)
{
if((subscript>10) ||(subscript<=0)){
cerr<<"\nError: Subsript "<<subscript<<" is out of range."<<endl;
exit(1);
}
return ((*this).ptr[subscript]);
}
//fine della fuzione indicizzazzione per oggetti non costanti

//funzione che definisce l'operatore di iindicizzazzione per oggetti costanti

int & Array::operator[](int subscript) const{
if ((subscript>10) ||(subscript<=10)){
cerr<<"\nError: Subscript "<<subscript<<" is out of range."<<endl;
exit(1);
}
return(ptr[subscript]);
}
//fine della funzione che definisce l'operatore di indicizzazzione
//per ogeeti costanti

ostream & operator<<(ostream& output,const Array &a){
for(int i=0;i<a.size;i++)
{
output<<setw(2)<<a.ptr[i];
if((i%4)==0)
output<<endl;
}
return output;//abilita le chiamate in cascata
}

istream & operator>>(istream &input,const Array &a){
for(int i=0;i<a.size;i++)
{
input>>a.ptr[i];
}
return input;//abilita le chiamate in cascata
}

oregon
06-11-2007, 21:59
Nessun problema (ho provato con VS 2003).

(Perche' adesso hai i file Array100.h e Array100.cpp al posto di Array.h e Array.cpp ... ? Probabilmente stai facendo un po' di confusione ...)

manu86
06-11-2007, 22:21
gli ho cambiato nome io....bo ora provo a compilarlo con dev c++...
cmq grazie

MacApp
07-11-2007, 09:08
Ho compilato Array100.cpp (aggiungendo a fine file

int main (){
Array aArray;
return 0;
}

per superare il linking) con g++ -Wall versione "i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)" :

Nessun errore, nessun warning, anche eseguendolo (ok la main molto semplice) nessun errore.

EDIT:
attento che in:


const Array &Array::operator=(const Array &right){
if(&right!=this){
if(right.size!=(*this).size){
delete[] ptr;
(*this).size=right.size;
}
for(int i=0;i<size;i++){
(*this).ptr[i]=right.ptr[i];
}
}
return *this;//abilita le chiamater in cascata
}


quando fai delete [] ptr, poi non lo riallochi.

Loading