Bug su una classe C ++ personalizzata
-
05-07-2019 - |
Domanda
Ho bisogno di aiuto per trovare il problema usando una classe c ++ personalizzata per gestire le posizioni 3D. Ecco il codice pertinente della classe
Punto operator+(Punto p){
return Punto(this->x + p.x, this->y + p.y, this->z + p.z);
}
Punto operator+(Punto *p){
return Punto(this->x + p->x, this->y + p->y, this->z + p->z);
}
Punto operator-(Punto p){
return Punto(this->x - p.x, this->y - p.y, this->z - p.z);
}
Punto operator-(Punto *p){
return Punto(this->x - p->x, this->y - p->y, this->z - p->z);
}
Punto *operator=(Punto p){
this->x = p.x;
this->y = p.y;
this->z = p.z;
return this;
}
Punto *operator=(Punto *p){
this->x = p->x;
this->y = p->y;
this->z = p->z;
return this;
}
Lo sto usando qui in questo modo:
p = fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
Dove nodo [i] è un Punto *, e si compila bene, ma quando provo a fare:
p = fem->elementoFrontera[i]->nodo[0] + fem->elementoFrontera[i]->nodo[1];
Il compilatore dice:
Nella funzione membro
nullo mdTOT :: pintarElementosFrontera () ': errore: operandi di tipi non validi
Punto * 'ePunto *' in binario
operatore + '
Soluzione
Il primo viene compilato correttamente perché è possibile sottrarre i puntatori in C / C ++, ma non aggiungere i puntatori. Ma in ogni caso non fa quello che ti serve - non usa il tuo operatore sovraccarico. Poiché i tuoi operatori sono definiti in una classe, devi operare su istanze di classe, non su puntatori. Quindi, cambia in qualcosa del tipo
Punto p = *(fem->elementoFrontera[i]->nodo[0]) + *(fem->elementoFrontera[i]->nodo[1]);
Un'altra cosa: dovresti usare riferimenti di classe, non valori, nella definizione dell'operatore. Per es.
Punto& operator+(const Punto& p) {
EDIT. Per semplificare il codice, è possibile creare una funzione di accesso, come questa:
const Punto& NodoRef(int i, int j) {
return *(fem->elementoFronteria[i]->Nodo[j]);
}
e quindi il tuo codice diventa pulito come
p = NodoRef(i,0) + NodoRef(i,1);
Il NodoRef può essere definito nella tua classe fem o fuori. Assicurati solo che l'oggetto fem sia vivo nell'ambito in cui usi NodoRef.
Altri suggerimenti
La prima versione funziona perché " -
" fa l'aritmetica normale del puntatore in questo caso, non usa nessuno degli operatori sovraccarichi. & Quot; +
" non è definito sui normali puntatori, quindi viene visualizzato un errore. Per farlo usare la versione sovraccarica, fai riferimento al primo puntatore:
p = *fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
Anche il dereferenziamento di entrambi i puntatori dovrebbe funzionare poiché si hanno entrambi i tipi di sovraccarico, ma in questo caso è necessario modificare le definizioni dell'operatore per utilizzare i riferimenti const:
Punto operator+(const Punto &p){
...
}
In questo modo gli oggetti non vengono copiati ogni volta che usi " +
" ;.
Fondamentalmente vuoi fare qualcosa del genere:
const Punto operator+(Punto *left, Punto *right); // not allowed
Ma il sovraccarico di una funzione gratuita operator +
che accetta due puntatori e li aggiunge in modo appropriato non funziona, perché almeno uno dei parametri deve essere enum o tipo di classe . Non vi è alcun sovraccarico da parte dell'operatore per i tipi primitivi e i puntatori contano come tali.