سؤال

وأنا بحاجة للمساعدة في العثور على المشكلة باستخدام مخصص ج ++ فئة لإدارة المراكز 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 "> التعداد أو فئة نوع . ليس هناك عامل الحمولة الزائدة لأنواع بدائية، والاعتماد المؤشرات على هذا النحو.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top