有人可以告诉我编译器如何调用运算符:
operator ELEMENT()const {
return pArray->arr[index];
}
主要来自第6行:
(*ptr3)[0] = a1[0] + a2[1];
如何使用+运算符添加两个ELEMENT对象? ELEMENT类中没有+运算符重载。
谢谢, Liron
#include <iostream>
using namespace std;
template<class ELEMENT> class Array
{
class Element
{
Array<ELEMENT>* pArray;
int index;
public:
Element(Array<ELEMENT>* p, int i)
: pArray(p), index(i) {}
const Element& operator=(const ELEMENT& e) {
pArray->set(index, e); // call copy-on-write
return *this;
}
operator ELEMENT()const {
return pArray->arr[index];
}
};
friend class Element;
ELEMENT* arr;
int size;
int* ref_counter;
void attach(const Array& a) {
arr = a.arr; size = a.size;
ref_counter = a.ref_counter;
++(*ref_counter);
}
void detach() {
if(--(*ref_counter) == 0) {
delete []arr;
delete ref_counter;
}
}
void set(int index, const ELEMENT& e) {
if(*ref_counter > 1) { // need copy-on-write!
Array temp = clone();
detach();
attach(temp);
}
arr[index] = e;
}
public:
explicit Array(int);
Array<ELEMENT> clone()const;
Array(const Array<ELEMENT>& a){attach(a);}
~Array(){detach();}
const Array& operator=(const Array<ELEMENT>& a) {
detach(); attach(a); return *this;
}
Element operator[](int index) {
return Element(this, index);
}
const ELEMENT& operator[](int index)const {
return arr[index];
}
};
template<class ELEMENT>
Array<ELEMENT>::Array(int size1)
: size(size1), ref_counter(new int(1))
{
arr = new ELEMENT[size];
}
template<class ELEMENT>
Array<ELEMENT> Array<ELEMENT>::clone()const {
Array temp(size);
for(int i=0; i<size; ++i) {
temp.arr[i] = arr[i];
}
return temp;
}
int main()
{
Array<int> a1(1), a2(2);
Array<int>* ptr3 = new Array<int>(3);
a2[0] = 1;
a2[1] = 2;
a1 = a2;
(*ptr3)[0] = a1[0] + a2[1];
(*ptr3)[1] = a1[1] + a2[0];
cout << (*ptr3)[0] << ", " << (*ptr3)[1] << endl;
delete ptr3;
return 1;
}
答案 0 :(得分:2)
如何使用+运算符添加两个ELEMENT对象? ELEMENT类中没有+运算符重载。
ELEMENT
不是类,它是一个类型参数。在您的示例中,为该参数指定的类型为int
。显然int
确实有一个+
运算符,因此工作正常。如果您尝试创建Array<SomeType>
,其中SomeType
没有+
运算符,则会出错。
有一个Element
类,该类确实没有+
运算符,但该类可隐式转换为ELEMENT
(在本例中为int
),因此,当您将+
应用于Element
的对象时,编译器会向该转换运算符添加一个调用,并将+
应用于结果。