2013-04-03 2 views
2

Je suis très novice en C++, donc c'est peut-être un problème assez complexe, mais j'ai de la difficulté à trouver une solution. J'ai cherché une réponse, et le TA semble avoir un code de travail équivalent mais mystérieusement logique, et nous ne pouvons pas comprendre pourquoi.Utilisation non valide d'un membre de données non-statique (tableau)

J'essaie de déclarer un tableau (nommé 'tableau) dans mon fichier d'en-tête, et je continue à recevoir des erreurs impaires. Quand je le déclare publiquement comme "int * array;" ou "int array [];", le constructeur me dit qu'il s'agit d'une utilisation invalide d'un membre de données non statique. Quand je le déclare privé, il se plaint que les éléments du tableau sont privés.

Les offres de mission avec la surcharge des opérateurs, et traite des tableaux avec des indices impairs, tels que de -3 à 5. On trouvera ci-un code correspondant au problème:

// from the .cpp file 
//constructor 
IntArray::IntArray(int USER_DEFINED) 
{ 
    if (USER_DEFINED < 1) 
    { 
     //return some kind of error 
    } 
    string name; 
    setName(); 
    int lower = 0; 
    int higher = USER_DEFINED - 1; 
    array = new int[higher - lower]; 
    //int* p = &array[abs(lower)]; 
} 

//overload 
int IntArray::operator[](int i) 
{ 
    if (i < lower || i > higher) 
    { 
     //return some sort of error 
    } 
    else 
     return array[i - lower]; 
} 

//from the .h file 
class IntArray { 
    public: 
      int* array; 
      int operator[](int i); 
}; 

//from the driver 
void test1() { 
    cout << "1. Array declared with single integer: IntArray a(10);" << endl << endl; 
    csis << "1. Array declared with single integer: IntArray a(10);" << endl << endl; 
    IntArray a(10); 
    for(int i = a.low(); i <= a.high(); i++) 
     a[i] = i * 10; 
    a.setName("a"); 
    cout << a << endl; 
    csis << a << endl; 
    wait(); 
}` 

a [i] = i * dix; est où le compilateur se plaint.

Merci d'avance pour toute aide.

+2

Cette surcharge de 'operator []' ne correspond pas à la signature lvalue ou rvalue appropriée. – chris

+1

@chris: Ça me va bien. C'est un peu étrange d'avoir un retour de 'operator []' en valeur, mais il devrait être valide. –

+0

@BillyONeal, Si c'est pour un rvalue, ce devrait être une fonction 'const'. – chris

Répondre

3

Votre operator[] renvoie un int, qui est renvoyé à l'appelant en tant que serveur temporaire sans nom; un "rvalue". (Historiquement appelé parce que c'est l'ensemble des opérations autorisées à se produire sur la moitié droite d'une instruction)

Une instruction comme a[i] = i * 10; n'aurait pas de sens, car vous modifieriez le résultat temporaire sans nom de a[i]. Si vous voulez que quelqu'un puisse modifier le int dans la mémoire pointée sur IntArray::array, renvoyez une référence à la place.

Questions connexes