Перегрузка оператора C ++ для установки указателей в объекте на другие объекты - PullRequest
1 голос
/ 09 апреля 2020

Для программного задания мне нужно создать программу, которая использует классы, объекты и перегрузку операторов, чтобы «жениться» на двух человек вместе. Вот что у меня есть:

#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;

class Family{
public: 
   string name; 
   int age; 
   //An object pointer of Family to represent a spouse 
   Family * spouse; 

   /** 
   * A constructor that takes 3 arguments 
   * @param n  takes default 'unknown' 
   * @param a  takes default 18
   * @param s  takes default NULL
   */ 

   Family( string n="Unknown", int a=18, Family * s=NULL){
       name=n; 
       age=a; 
       spouse=s; 
   }

   friend void operator&(Family a, Family b) { // Marries two family objects
      Family A(a.name, a.age, &b);
      Family B(b.name, b.age, &a);
      a = A;
      b = B;
   }

   friend bool operator&&(Family a, Family b) { // Checks if two Family objects are married
      if (a.spouse == &b && b.spouse == &a) {
     return 1;
      } else {
     return 0;
      }
   }
};

int main(int argc, char** argv) {
    //Declaring an object F using a name and age=18 representing a female.
      Family F("Nicky",18);
    //Declaring an object M using a name, age =19 and spouse being the previous object
      Family  M("Nick",19,&F);

    //1pt Check if they are married or not using the operator &&
    cout << "Are they married " << (F&&M) << endl;
    //1pt Marry them to each other using the operator &
    (F & M);
    //1pt Check if they are married or not using && 
    cout << "Are they married " << (F&&M) << endl;
    // Printing the spouse of the Female 
    cout<< "The spouse of female "<< F.spouse->name<<endl; 
    // Printing the spouse of the male 
    cout<< "The spouse of male "<< M.spouse->name<<endl; 

    return 0;
}

Когда я проверяю, женаты ли они друг на друге, используя &&, он возвращает 0 оба раза. Когда он пытается напечатать имя супруга (F.spouse-> name), я получаю segfault. Я очень неопытен с указателями, но я вполне уверен, что проблема в & оператор. Я просто не уверен, что происходит не так.

1 Ответ

1 голос
/ 09 апреля 2020
friend void operator&(Family a, Family b) { // Marries two family objects
      Family A(a.name, a.age, &b);
      Family B(b.name, b.age, &a);
      a = A;
      b = B;
   }

вы устанавливаете объекты, которые копируются из переданных аргументов, в параметр.

#include <iostream>

class Family {
public:
    Family() {
        std::cout << "default ctor\n";
    }
    Family(const Family &) {
        std::cout << "copy ctor\n";
    }
};

void foo(Family a) {
    std::cout << "address of parameter " << &a << "\n";
}

int main() {
    Family f;
    std::cout << "address of real object " << &f << "\n";
    foo(f);
}

он выводит

default ctor
address of real object 0x7ffee1255928
copy ctor
address of parameter 0x7ffee1255920

Как видите, это разные объекты. Первый объект Family был создан с

Family f;

, после чего мы записываем адрес адреса f и когда мы отправляем в качестве аргумента функцию foo в качестве параметра этого объекта. мы видим, что копирование ctor работает.

friend void operator&(Family &a, Family &b) { // Marries two family objects
      Family A(a.name, a.age, &b);
      Family B(b.name, b.age, &a);
      a = A;
      b = B;
   }

Вы должны использовать ссылку на значение L, чтобы установить этот объект.

...