重载 [] 运算符

Overloading the [] operator

本文关键字:运算符 重载      更新时间:2023-10-16

我是C++的初学者。我正在学习如何使操作员过载。我创建了一个表示复数和复数算术方法的类Complex,以及一个表示复向量空间 C 中元素固定长度数组的类ComplexArray

我收到编译器错误,它无法找到正确的运算符形式[]。但是,我搜索了互联网,但无法纠正错误。任何正确方向的提示/技巧都将提供巨大的帮助。

严重性代码说明 项目文件行抑制状态
错误 C2676 二进制"[": 'const ComplexArray' 未定义此运算符或转换为预定义运算符可接受的类型 复杂数组 c:\users\quasa\source\repos\complexarrays\complexarrays\testcomplexarrays.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);
};

复杂阵列.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];
}

复杂.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();
};

正如你们都指出的那样 - 我缺少 #include 的前向定义。

复杂.cpp有标题

#include "Complex.h"

ComplexArray.h有标头

#include "Complex.h"

ComplexArray.cpp有标头

#include "ComplexArray.h"

TestComplexNumbers.cpp具有标头

#include <iostream>
#include "ComplexArray.h"

我的编译时错误已解决。

我认为错误不是来自运算符[],正如您在函数中看到的那样:

Complex ComplexSum(const ComplexArray& cArray, int size)
{
Complex sum = cArray[0];
for (int i = 1; i < cArray.MaxIndex(); i++)
{
sum = sum + cArray[i];
}
}

您不返回结果。这是致命的。

ComplexArray 依赖于 Complex,但包含的顺序看起来不正确

#include "ComplexArray.h"
#include "Complex.h"

您必须在ComplexArray之前转发声明Complex

class Complex; 

代码在 \testcomplexarray.cpp第 7 行失败,即

Complex sum = cArray[0];

看起来您对复杂 ctors 有问题。确保您没有定义以下内容:

Complex(Complex& v);  // that's bad. it prevents to use copy constructor

如果您出于某种不可思议的原因需要复制 ctor,它应该始终如下所示:

Complex(const Complex& v);