-3

我想實現我自己的數組包裝。我重載了[]運算符,返回數組中元素的地址。但是,當我動態地分配在主要的ArrayWrapper類,它不起作用。通過重載運算符訪問自定義數組包裝中的元素[]

爲什麼它不起作用?是否因爲變量arr是一個指針?

我得到這些錯誤:

描述資源路徑位置類型不能綁定 '的std :: ostream的{又名 的std :: basic_ostream}' 左值到 '的std :: basic_ostream & &' Cviceni。 CPP/Cviceni/SRC線25 C/C++ 問題

描述資源路徑位置類型不匹配關於 '操作者< <' (操作數的類型是「的std :: ostream的{又名的std ::基本_ostream}」和 'ArrayWrapper')Cviceni.cpp/Cviceni/SRC線25 C/C++問題

工作碼

ArrayWrapper arr(250); 

try 
{ 
    for(int i = 0; i < arr.getSize(); i++) 
    { 
    arr[i] = i + 1; 
    cout << arr[i] << endl; 
    } 
} 
catch(std::range_error& e) 
    { 
     cout << e.what() << endl; 
    } 

    cout << "End..." << endl; 

    return 0; 
} 

不工作的代碼:

ArrayWrapper *arr = new ArrayWrapper(250); 

    try 
    { 
    for(int i = 0; i < arr->getSize(); i++) 
    { 
     arr[i] = i + 1; 
     cout << arr[i] << endl; 
    } 
    } 

ArrayWrapper實現:

class ArrayWrapper 
{ 
private: 
    int size; 
    int *elements; 

public: 
    ArrayWrapper(int n) : size(n), elements(new int[n]) 
    { 
    for(int i = 0; i < size; i++) 
     elements[i] = 0; 
    }; 

    ~ArrayWrapper(){delete []elements;}; 

    int& operator[](int i) 
    { 
    if(i >= size || i < 0) 
     { 
    throw range_error("Out of range"); 
     } 
    return elements[i]; 
    }; 

    int getSize(){ return size;}; 
}; 
+0

將錯誤消息複製粘貼到問題本身中。 –

+1

只需將'cout << arr [i] << endl;'更改爲'cout <<(* arr)[i] << endl;'。你根本不應該爲這種情況弄個指針。 –

+1

另外[三條法則](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree); *「我重載了[]運算符,返回數組中元素的地址。」* - 否,它返回一個引用。如果您使用'size_t'作爲索引和大小,則不需要檢查負數。 – LogicStuff

回答

2

這是您正在使用指針在第二個例子中 arr[2]沒有在ArrayWrapper它是在指針操作的操作。

ArrayWrapper *arr = new ArrayWrapper(250); 

    try 
    { 
    for(int i = 0; i < arr->getSize(); i++) 
    { 
     (*arr)[i] = i + 1; 
     cout << (*arr)[i] << endl; 
    } 
    }