Перегрузка оператора []
Я новичок в C++. Я изучаю, как перегружать операторов. Я создал класс Complex, представляющий комплексные числа и методы для сложной арифметики и класс ComplexArray, который представляет массивы фиксированной длины элементов в комплексном векторном пространстве C.
Я получаю ошибки компилятора, что он не может найти правильную форму оператора []. Однако я искал в Интернете, и я не могу исправить ошибку. Любые подсказки/подсказки в правильном направлении окажут огромную помощь.
Код серьезности Описание Состояние подавления строки файла проекта
Ошибка C2676 binary '[': 'const ComplexArray' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора ComplexArrays c:\users\quasa\source\repos\complexarrays\complexarrays\testcomplexarray.cpp 7
Вот мой код:
TestComplexArray.cpp
#include <iostream>
#include "ComplexArray.h"
Complex ComplexSum(const ComplexArray& cArray, int size)
{
Complex sum = cArray[0];
for (int i = 1; i < size; i++)
{
sum = sum + cArray[i];
}
return sum;
}
Complex ComplexProduct(const ComplexArray& cArray, int size)
{
Complex product = cArray[0];
for (int j = 1; j < size; j++)
{
product = product * cArray[j];
}
return product;
}
int main()
{
char ch;
const int size = 5;
ComplexArray cArray(size);
for (int i = 0; i < size; i++)
{
cArray[i] = Complex((double)(i + 1), 0);
std::cout << cArray[i];
}
Complex sum = ComplexSum(cArray, size);
Complex product = ComplexProduct(cArray, size);
std::cout << "Sum = " << sum << std::endl;
std::cout << "Product = " << product << std::endl;
std::cin >> ch;
return 0;
}
ComplexArray.h
class ComplexArray
{
private:
Complex* complexArr;
int size;
ComplexArray();
public:
//Constructors and destructors
ComplexArray(int size);
ComplexArray(const ComplexArray& source);
virtual ~ComplexArray();
//Range for the complexArr
int MaxIndex() const;
//Overload the indexing operator
const Complex& operator [](int index) const;
Complex& operator [](int index);
};
ComplexArray.cpp
#include "Complex.h"
#include "ComplexArray.h"
ComplexArray::ComplexArray(int s)
{
size = s;
complexArr = new Complex[size];
}
ComplexArray::ComplexArray(const ComplexArray& source)
{
//Deep copy source
size = source.size;
complexArr = new Complex[size];
for (int i = 0; i < size; i++)
{
complexArr[i] = source.complexArr[i];
}
}
ComplexArray::~ComplexArray()
{
delete[] complexArr;
}
int ComplexArray::MaxIndex() const
{
return (size - 1);
}
/*
c1.operator[](int index) should return a reference to the Complex
object, because there are two possible cases.
Case 1:
Complex c = complexArray[3];
Case 2:
complexArray[3] = c;
In the second case, complexArray[3] is an lvalue, so it must return
a Complex object by reference, so that it can be assigned to.
*/
const Complex& ComplexArray::operator[] (int index) const
{
return complexArr[index];
}
Complex& ComplexArray::operator[](int index)
{
return complexArr[index];
}
complex.h
#include <iostream>
class Complex
{
private:
double x;
double y;
void init(double xs, double ys); //Private helper function
public:
//Constructors and destructors
Complex();
Complex(const Complex& z);
Complex(double xs, double ys);
virtual ~Complex();
//Selectors
double X() const;
double Y() const;
//Modifiers
void X(double xs);
void Y(double ys);
//Overload binary +, = and * operators
Complex operator + (const Complex& z);
Complex& operator = (const Complex& z);
Complex operator * (const Complex& z) const;
//Overload unary - operator
Complex operator -() const;
friend Complex operator * (const double alpha, const Complex& z);
friend Complex operator * (const Complex& z, const double beta);
//Overload << operator
friend std::ostream& operator << (std::ostream& os, const Complex& z);
//A complex function f(z)=z^2
Complex square();
};
Ответы
Ответ 1
Как вы все это указали, я пропустил прямое определение #include.
У Complex.cpp есть заголовок
#include "Complex.h"
У ComplexArray.h есть заголовок
#include "Complex.h"
У ComplexArray.cpp есть заголовок
#include "ComplexArray.h"
TestComplexNumbers.cpp имеет заголовок
#include <iostream>
#include "ComplexArray.h"
Мои ошибки времени компиляции были решены.
Ответ 2
Я не думаю, что ошибка исходит от оператора [], как вы можете видеть в функции:
Complex ComplexSum(const ComplexArray& cArray, int size)
{
Complex sum = cArray[0];
for (int i = 1; i < cArray.MaxIndex(); i++)
{
sum = sum + cArray[i];
}
}
Вы не возвращаете результат. Это смертельно.
Ответ 3
ComplexArray зависит от комплекса, но порядок включений не выглядит правильным
#include "ComplexArray.h"
#include "Complex.h"
Вы должны переслать-объявить Complex
перед ComplexArray
class Complex;
Ошибка кода на \testcomplexarray.cpp строке 7, которая
Complex sum = cArray[0];
Похоже, у вас проблемы с ctors of Complex. Убедитесь, что вы НЕ определили такие:
Complex(Complex& v); // that bad. it prevents to use copy constructor
Если вам нужна копия ctor по какой-то непостижимой причине, она всегда должна выглядеть так:
Complex(const Complex& v);