2017-10-14 121 views
-1

最初は英語が上手くなく、初めてStackOverflowでもうまくいきませんが、私は自分のコードの問題について説明しようとしています。この演算子関数のパラメータが多すぎます

私は、私の教授から私自身のVector(似たようなもの)を作るように頼まれました。そして、ベクトルコンテナの要求された位置の要素への参照を返す問題があります。要求された位置が範囲外である場合、いくつかのメッセージを出力してプログラムを終了する必要があります。

これをオペレータのオーバーロードにする必要があります。これが私のコードです。

 double operator [](int n, const MyDoubleVector& _mV)//The arror come out at this line. 
    { 
     if(n > num)//'num' is private reference in class to count array. it typed int. 
     { 
      return 0; 
     } 

     return &_mV.data[n];//'data' is private reference in class. It declare like 'double *data = new double [num];' 
    } 

は、私は時々「友人」この問題を解決することを見たが、私はこの行で「友人」を入れたとき、それは私が好きと述べ、「演算子[]メンバ関数でなければなりません。」 最後に、どうやってやるのか分かりません。私を助けてくれますか?

+1

あなたは添字演算子をそのように過負荷をかけると、複数のパラメータを持つことができません。 [This](http://www.learncpp.com/cpp-tutorial/98-overloading-the-script-operator/)は読むのに便利です。 – deepmax

+0

なぜMyDoubleVectorがパラメータとして必要ですか?オーバーロードがクラスの一部である場合は、必要なすべてにアクセスできます。 – Mark

答えて

0

クラスMyDoubleVectorのメンバー関数としてoperator []のオーバーロードを実装する必要があります。ここ は、定義です:クラスのメンバとして定義する必要があります[]

double & MyDoubleVector::operator[](int index); 
0

演算子。

例:

#include <iostream> 
#include <cstdlib> 
#include <algorithm> 

struct MyDoubleVector 
{ 
    MyDoubleVector() 
    {} 

    MyDoubleVector(MyDoubleVector const& other) 
    { 
     // very naiive copy constructor 
     if (other.data) 
     { 
      std::for_each(other.data, other.data + other.num, [&](double val) 
      { 
       this->push(val); 
      }); 
     } 
    } 

    MyDoubleVector& operator=(MyDoubleVector const& other) 
    { 
     auto temp = other; // invoke copy constructor 
     std::swap(num, temp.num); 
     std::swap(capacity, temp.capacity); 
     std::swap(data, temp.data); 
     return *this; 
    } 

    ~MyDoubleVector() 
    { 
     delete [] data; 
    } 

    double& operator [](int n); 
    /** either define the method inline like this... 
    { 
     if(n > num) 
     { 
      std::cerr << "MyDoubleVector::operator[]: index " << n << " out of range" << std::endl; 
      std::exit(100); 
     } 

     return data[n]; 
    } 
    **/ 

    void push(double val) 
    { 
     if (num == capacity) 
     { 
      more(); 
     } 
     data[num++] = val; 
    } 

private: 

    void more() 
    { 
     if (!data) 
     { 
      data = new double [10]; 
      capacity = 16; 
     } 
     else 
     { 
      auto newcapacity = capacity * 2; 
      auto newdata = new double [newcapacity]; 
      std::copy(data, data + capacity, newdata); 
      std::swap(data, newdata); 
      capacity = newcapacity; 
      delete [] newdata; 
     } 
    } 

    int num = 0; 
    int capacity = 0; 
    double* data = nullptr; 
}; 

/** ... 
    ** or out of line like this 
    **/ 

double& MyDoubleVector::operator [](int n) 
{ 
    if(n > num) 
    { 
     std::cerr << "MyDoubleVector::operator[]: index " << n << " out of range" << std::endl; 
     std::exit(100); 
    } 

    return data[n]; 
} 


int main() 
{ 
    MyDoubleVector v; 
    v.push(10.0); 
    v[1]; 
} 
関連する問題