حشرة على العرف الفئة C ++
-
05-07-2019 - |
سؤال
وأنا بحاجة للمساعدة في العثور على المشكلة باستخدام مخصص ج ++ فئة لإدارة المراكز 3D. هنا هو رمز ذات الصلة من الدرجة
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;
}
وأنا أستخدم هنا مثل هذا:
p = fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
وأين نودو [أنا] هو بونتو *، وأنه يجمع ما يرام، ولكن عندما أحاول القيام به:
p = fem->elementoFrontera[i]->nodo[0] + fem->elementoFrontera[i]->nodo[1];
والمترجم يقول:
<اقتباس فقرة> في عضو وظيفة void
mdTOT::pintarElementosFrontera()':
error: invalid operands of types
Punto * وPunto*' to binary
operator + '
المحلول
وأول واحد يجمع ما يرام لأنه يمكنك طرح المؤشرات في C / C ++، ولكن لا تضيف المؤشرات. ولكن على أي حال لا تفعل ما تريد - لا يستخدم المشغل طاقتها. حيث يتم تعريف مشغلي الخاص في فئة، تحتاج للعمل على حالات الدرجة، وليس على المؤشرات. لذلك، تغيير إلى شيء من هذا القبيل
Punto p = *(fem->elementoFrontera[i]->nodo[0]) + *(fem->elementoFrontera[i]->nodo[1]);
وشيء آخر - يجب استخدام مراجع الدرجة، وليس القيم، في تعريف المشغل. منها مثلا.
Punto& operator+(const Punto& p) {
وتحرير. لتبسيط التعليمات البرمجية، يمكنك إنشاء وظيفة استرجاع، مثل هذا:
const Punto& NodoRef(int i, int j) {
return *(fem->elementoFronteria[i]->Nodo[j]);
}
وثم كود الخاص بك وتصبح نظيفة كما
p = NodoRef(i,0) + NodoRef(i,1);
ويمكن تعريف NodoRef في الصف فيم الخاص بك، أو خارجها. فقط للتأكد من فيم الكائن على قيد الحياة في نطاق حيث يمكنك استخدام NodoRef.
نصائح أخرى
والنسخة الأولى يعمل لأن "-
" لا علم الحساب المؤشر العادي في هذه الحالة، فإنه لا يستخدم أي من مشغلي الخاص بك فوق طاقتها. لم يتم تعريف "+
" على مؤشرات العادية، حتى تحصل على خطأ. لجعله استخدام الإصدار طاقتها، dereference المؤشر الأول:
p = *fem->elementoFrontera[i]->nodo[0] - fem->elementoFrontera[i]->nodo[1];
وDereferencing كل من مؤشرات يجب أن تعمل أيضا لأن لديك كلا النوعين من الزائدة، ولكن يجب تغيير تعريفات المشغل الخاص بك لاستخدام المراجع CONST في هذه الحالة:
Punto operator+(const Punto &p){
...
}
وهذه الطريقة لا يتم نسخ الكائنات في كل مرة تستخدم فيها "+
".
وأساسا كنت تريد أن تفعل شيئا من هذا القبيل:
const Punto operator+(Punto *left, Punto *right); // not allowed
ولكن الحمولة الزائدة على operator+
وظيفة مجانا يأخذ اثنين من المؤشرات ويضيف عليها بطريقة مناسبة لا يعمل، لأن واحدا على الأقل من المعلمات يجب أن يكون من <لأ href = "http://www.parashift.com/ ج ++ - أسئلة وأجوبة لايت / جوهري-types.html # أسئلة وأجوبة-26.10 "يختلط =" نوفولو noreferrer "> التعداد أو فئة نوع . ليس هناك عامل الحمولة الزائدة لأنواع بدائية، والاعتماد المؤشرات على هذا النحو.