Использование конструктора для преобразования переменной в объект в c ++ - PullRequest
0 голосов
/ 15 ноября 2018
 int main()
 {
     CComplex c1(9,9);
     CComplex c3;
     c3 = 5 + c1;    // getting error here
     c3.print();
     cout << c3;

     return 0;
  }

  CComplex CComplex::operator+(const CComplex &complex)
  {
        CComplex temp;
        temp.m_real = complex.m_real + m_real;
        temp.m_imaginary = complex.m_imaginary + m_imaginary;
        return temp;
  }

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я думаю, что правильное решение:

class CComplex {
public:
  CComplex();
  CComplex(int);  // NEW - CONVERSION CONSTRUCTOR
  CComplex(double real);
  CComplex(double real, double imaginary);
  friend CComplex operator + (const CComplex& a, const CComplex& b); // FRIEND - NON-MEMBER FUNCTION
};

Обратите внимание на следующие функции в коде:

  • Существует конструктор, получающий один int параметр. Это конструктор приведения, который компилятор может использовать для автоматического преобразования из int в CComplex.
  • operator+ - функция, не являющаяся членом (ключевое слово friend делает функцию неучастной). Это немного отличается от ситуации, когда operator+ является функцией-членом (CComplex operator+(CComplex const &b) const).

Если вы напишите:

CComplex c1;
5 + c1;

Затем для 5 + c1 ищется operator+ с параметрами (int,CComplex). В соответствии со стандартом C ++ допускается только одно преобразование для получения правильных типов параметров (извините, у меня нет формальных кавычек). Существует конструктор преобразования из int в CComplex, поэтому автоматически вызывается этот конструктор преобразования, а затем operator+(CComplex,CComplex) с соответствующими параметрами.

Если у вас не было CComplex(int) конструктора, то 5 + c1 не будет работать, потому что требуется ДВУХ преобразование из: int в double и из double в CComplex.

Кроме того, если бы operator+ была функцией-членом (не friend), она бы вообще не работала. Потому что в соответствии со стандартом C ++ нет возможности автоматического преобразования для левого операнда. Так что даже конструктор преобразования CComplex(int) не поможет.

Плюс: я думаю, что перегрузка operator+ для таких типов, как (int, CComplex) не очень хорошая идея, потому что это может привести к взрыву объявлений. То же самое, что вам нужно для operator-() и для любого порядка операндов - например, (CComplex,int), (CComplex,long) и т. Д. Предоставляя конструктор преобразования из необходимых типов, вы получаете все эти комбинации «автоматически» и «бесплатно».

0 голосов
/ 15 ноября 2018

Вам необходим оператор перегрузки + для типа int и добавьте несколько конструкторов, если они не определены

class CComplex
{
public:
    CComplex()
        : m_real(0), m_imaginary(0)
    { }
    CComplex(double real)
        : m_real(real), m_imaginary(0)
    { }
    CComplex(double real, double imaginary)
        : m_real(real), m_imaginary(imaginary)
    { }

    CComplex operator + (const CComplex& complex)
    {
        CComplex temp;
        temp.m_real = complex.m_real + m_real;
        temp.m_imaginary = complex.m_imaginary + m_imaginary;
        return temp;
    }

    double m_real;
    double m_imaginary;
};


CComplex operator + (const int value, const CComplex& complex)
{
    return CComplex(value) + complex;
}

std::ostream& operator << (std::ostream& os, const CComplex& complex)
{
    os << "(" << complex.m_real << "," << complex.m_imaginary << ")";
    return os;
}


int main()
{
    CComplex c1(9,9);
    CComplex c3;
    c3 = 5 + c1;    // no more error here
    std::cout << c3;
    return 0;
}

Результат

(14,9)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...