2

我重載兩個標操作和賦值操作符,我試圖通過重載下標操作者,我可以得到0值以獲得正確的值賦值運算符 例如 Array x; x[0]=5; 但是當我重載賦值運算符它分配,但它不使用我的重載函數,因爲vaiable 2應有的價值5重載賦值運算符標操作

class Array 
{ 

public: 
    int *ptr; 
    int one,two; 
    Array(int arr[]) 
    { 
     ptr=arr; 
    } 

    int &operator[](int index) 
    { 
     one=index; 
     return ptr[index]; 
    } 
    int & operator=(int x){ 
     two=x; 
     return x; 
    } 
}; 

int main(void) 
{ 
    int y[]={1,2,3,4}; 
    Array x(y); 
    x[1]=5; 
    cout<<x[0]<<endl; 
} 
+0

我認爲@DietmarKühl答案是最好的答案。因爲它也顯示了操作符int()的用法,所以'cout << x [0] << endl;'也可以工作。也許它應該是被接受的答案。 – VinGarcia

回答

2

它不使用你的operator=因爲你沒有分配給的Array一個實例,你指派給int 。這將調用您的運營商:如果你想攔截的任務是什麼operator[]回報

Array x; 
x = 7; 

,你必須有它返回一個代理對象,並定義賦值運算符爲代理。例如:

class Array 
{ 
    class Proxy 
    { 
    Array &a; 
    int idx; 
    public: 
    Proxy(Array &a, int idx) : a(a), idx(idx) {} 
    int& operator= (int x) { a.two = x; a.ptr[idx] = x; return a.ptr[idx]; } 
    }; 

    Proxy operator[] (int index) { return Proxy(*this, index); } 
}; 
+0

,但我知道這個問題問擺脫這種形式的X權值[1] = 5;所以賦值運算符應該返回對象數組 – user2960763

+0

@ user2960763我加入代理使用的例子,而您添加的註釋。 – Angew

+0

感謝它的工作:D – user2960763

0

您的Array類重載operator=,不是int(你不能這樣做,順便說一句)。 x[1]=5;是使用Array::operator[]爲元素訪問,它返回一個int&,然後採用常規int賦值運算符爲=5一部分。 Array::operator=當你分配到整個對象(即你定義的方式,你可以做x = 5;),其元素/成員纔會被使用。

+0

我想使用類Array的賦值運算符不正常 – user2960763

0

你要什麼的operator=辦?我建議一個更好的簽名是

Array& operator=(int x) 

,它應該(我)返回一個自我參照*this,及(ii)應該做的重新初始化其他價值的一個更好的工作,也就是說,它可能會更有意義清除你的陣列或做類似的事情。在

#include <iostream> 

using namespace std; 

class Array 
{ 

public: 

    int *ptr; 
    int one,two; 
    Array(int arr[]) 
    : 
     one(0), two(0) 
    { 
     ptr=arr; 
    } 


    int &operator[](int index) 
    { 
     one=index; 
     return ptr[index]; 
    } 
    Array & operator=(int x){ 
     two=x; 
     return *this; 
    } 
}; 

std::ostream& operator<<(std::ostream& stream, const Array& array) 
{ 
    stream << "(" << array.one << ", " << array.two << ": "; 
    if (array.ptr) 
     stream << *(array.ptr); 
    stream << ")"; 
    return stream; 
} 

int main(void) 
{ 
    int y[]={1,2,3,4}; 
    Array x(y); 
    cout << "Before assigning one element: " << x << endl; 
    x[1]=5; 
    cout << "After assigning one element: " << x << endl; 
    x = 7; 
    cout << "After operator=:    " << x << endl; 
} 

可運行的源代碼:http://ideone.com/ejefcr

這裏是輸出。打印格式爲(one, two, ptr[0])。我想你想要成員變量one是最後訪問的元素的索引?

Before assigning one element: (0, 0: 1) 
After assigning one element: (1, 0: 1) 
After operator=:    (1, 7: 1) 
+0

我想使用數組的賦值運算符不正常的賦值運算符我怎麼能這樣做 – user2960763

1

您編寫的賦值運算符將應用於數組而不是數組元素。例如

x = 5; 

將使用您的賦值運算符。從它的外觀來看,您希望在使用下標運算符時應用overlaaed assignment運算符。獲得像這樣的工作的唯一方法是使用代理類:

struct Proxy { 
    Proxy(Array* array, int* element); 
    void operator= (int rhs) { 
     array->two = rhs; 
     *element = rhs; 
    } 
    operator int() const { return *element; } 
}; 
Proxy operator[](int index) 
{ 
    one=index; 
    return Proxy(this, ptr + index); 
} 
+0

這應該是被接受的答案。它適用於x [0]和x [1] = 5。 – VinGarcia