2016-04-03 19 views
1

Bazı int dizisini içeren bir sınıfa sahibim. Her bir elemanı belirli bir sayı ile çarpacak şekilde aşırı yüklenmek istiyorum. Sınıf çok yaygındır. 0 dizini bulunmamaktadır gibiDönen * bu

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

ve baskı, sonuç değeri olarak çağırmak

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 dizin her zaman bellekten rasgele sayı olduğu; Bu yalnızca one = one * 2'dan sonra olur. *this buna neden oluyor? Eğer öyleyse neden ve nasıl düzeltebilirim?

// ben kopya kurucu

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

ilan

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

olarak ve * bildirdikten Ve hala 0 indeksi

+0

Bu nasıl derlenir? “Operatör” yönteminizde, tanımlanmamış bir 'b' değişkenini kullanırsınız. –

+0

Ve neden dizininizi şu şekilde bildirmiyorsunuz: 'çift arr [5];' – worker11811

+0

Biri ne bekliyorsunuz [1] = 5; 'yapmak için? İfadenin sonunda var olan bir geçici paranın değerini değiştirmenin amacı nedir? Ayrıca, gerçekten uyguladığınız şeyin değerini değiştiren bir operatör * istiyor musunuz? Ve sahip olduğunuzdan, neden biri = bir * 2' - neden sadece bir "2" değil? –

cevap

3

olarak alt simge operatörü tanımlanmalıdır rastgele sayısından büyük atar takip eden yol

ve

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

veya

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

operator *

da benzeri

const TEST operator *(int a) const; 
^^^^^ 
bakabilirsiniz aşağıdaki şekilde

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

Ya deklarasyon tanımlanmalıdır

Ayrıca, kopya ataması operatörünü en azından (yıkıcı ve kopya oluşturucu dışında) açıkça tanımlamanız gerekir. İşte

bir demonstrasyon programlarından biri

#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; 
}  

Onun çıkışı

-20 10 0 8 0 

DÜZENLEME: Bu kodu kullanarak cevabım sonra bu mesajı değiştirdi kötü bir fikir cevabım gösterilmektedir . Kopya kurucunuz geçersiz. Bir dizi yerine çift tipte tek bir nesne oluşturur.

+0

Bu durumda kopya oluşturucuyu tanımlamam gerekiyor? Kaynaktaki – user3706129

+0

lotu, kopyalama kurucusunun ve kopyalama işlemi operatörünün kullanımda aynı olduğunu bildirmektedir. Neden her ikisini de ilan etmem gerekiyor? ilerleme için soru düzenledim. – user3706129

+0

@owacoder Yorumum cevabın önceki bir sürümüne atıfta bulundu. –