2016-04-03 7 views
1

私はいくつかのintの配列を含むクラスを持っています。私はoverload * operatorを使用して、すべての要素に特定の数を乗算します。クラスは非常に一般的です。それが0のインデックスを持っていないように私は返す* this

TEST one; 
one[1]=5; 
one[0]=-10; 
one[3]=4 
one = one * 2 

、それを印刷し、結果の値としてそれを呼び出す

class TEST{ 
public: 
     TEST(){ 
     size = 5; 
     arr = new double[size](); 
     } 
     double &operator [] (const int a){ 
     return arr[a]; 
     } 

     TEST operator *(const int a){ 
     for(int i = 0; i < size ;i++){ 
      arr[i] = arr[i] * a; 
     } 
     return *this; 
    } 
private: 
    int size; 
    double *arr; 
} 

は、0インデックスは、常にメモリから乱数です。これはone = one * 2の後にのみ発生します。これは*thisですか?もしそうなら、どうして私はそれを修正できますか?

// 私はコピーコンストラクタ

TEST(const TEST &a){ 
     size = a.size; 
     arr  = new double; 
     *arr = *a.arr; 
    } 

を宣言

TEST operator *(const int a){ 
     TEST temp; 
     for(int i = 0; i < size ;i++){ 
      temp.arr[i] = arr[i] * a; 
     } 
      return temp; 
} 

としておよび*宣言した、それはまだ0インデックス

+0

これはどのようにしてコンパイルされますか?あなたの 'operator'メソッドでは、定義されていない変数' b'を使います。 –

+0

あなたの配列を次のように宣言してください: 'double arr [5];' – worker11811

+0

あなたは 'one [1] = 5;'に何を期待していますか?声明の最後に存在しなくなった一時的な価値の価値を変更する点は何ですか?また、あなたが本当にそれを適用するものの値を変更する '演算子*'をしたいですか?あなたには1つしかないので、なぜ「1 = 1 * 2」 - なぜ「1 * 2」だけではないのですか? –

答えて

3

として添字演算子が定義されるべきランダムnubmerをスローします次のように

double & operator [] (int a){ 
    return arr[a]; 
    } 

double operator [] (int a) const { 
    return arr[a]; 
    } 

または

const double & operator [] (int a) const { 
    return arr[a]; 
    } 

operator *は次のよう

 TEST operator *(int a) const { 
     TEST tmp; 
     for(int i = 0; i < size ;i++){ 
      tmp.arr[i] = arr[i] * a; 
     } 
     return tmp; 
    } 

または宣言が

const TEST operator *(int a) const; 
^^^^^ 
のようにも見ることができると規定されるべきです

コピー代入演算子を明示的に(デストラクタとコピーコンストラクタを除いて)明示的に定義する必要もあります。それはあなたが私の答えに示すコードを使用して私の答えの後にあなたのポストを変更したことは悪い考えである:ここでは

は実証プログラムは、その出力が

-20 10 0 8 0 

EDITある

#include <iostream> 

class TEST 
{ 
public: 
    TEST() : size(5), arr(new double[size]()) 
    { 
    } 

    ~TEST() 
    { 
     delete []arr; 
    }   

    TEST & operator =(const TEST &rhs) 
    { 
     for(int i = 0; i < size ;i++) arr[i] = rhs.arr[i]; 

     return *this; 
    }    

    double & operator [] (int n) 
    { 
     return arr[n]; 
    } 

    const double & operator [] (int n) const 
    { 
     return arr[n]; 
    } 

    TEST operator *(int x) const 
    { 
     TEST tmp; 

     for (int i = 0; i < size ;i++) 
     { 
      tmp.arr[i] = x * arr[i]; 
     } 

     return tmp; 
    } 

    int count() const 
    { 
     return size; 
    }   
private: 
    int size; 
    double *arr; 
}; 

int main() 
{ 
    TEST one; 
    one[1] = 5; 
    one[0] =-10; 
    one[3] = 4; 
    one = one * 2; 

    for(int i = 0; i < one.count() ;i++) std::cout << one[i] << ' '; 
    std::cout << std::endl; 
}  

です。コピーコンストラクタが無効です。配列の代わりにdouble型のオブジェクトを1つだけ作成します。

+0

なぜこの場合にコピーコンストラクタを定義する必要がありますか? – user3706129

+0

ソースの多くは、コピーコンストラクタとコピーアサイメント演算子を宣言することは使用法が同じであることを示します。なぜ私は両方を宣言する必要がありますか?進歩のための質問を編集しました。 – user3706129

+0

@owacoder私のコメントは、答えの以前のバージョンを指していました。 –

関連する問題