-3

独自の配列ラッパーを実装しようとしています。 arrayの要素のアドレスを返す演算子をオーバーロードしました。しかし、私がMainでArrayWrapperクラスを動的に割り当てると、動作していません。オーバーロード演算子[]を介してカスタム配列ラッパーの要素にアクセスする[]

なぜ機能しないのですか?変数arrがポインタなのではありますか?

私はこれらのエラーを取得:

説明リソースパスの場所の種類は 'のstd :: basic_ostream & &' Cviceniに 'のstd :: ostreamに{別名 のstd :: basic_ostream}' 左辺値をバインドすることはできません。 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

また、[3つのルール](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three); * "配列の要素のアドレスを返す演算子をオーバーロードしました。" * - いいえ、参照を返します。インデックスとサイズに 'size_t'を使用した場合、負の数をチェックする必要はありません。 – LogicStuff

答えて

2

それは、ポインタの操作だArrayWrapper上の操作では、第二の例 arr[2]にポインタを使用していることをされていないのです。

ArrayWrapper *arr = new ArrayWrapper(250); 

    try 
    { 
    for(int i = 0; i < arr->getSize(); i++) 
    { 
     (*arr)[i] = i + 1; 
     cout << (*arr)[i] << endl; 
    } 
    } 
関連する問題