2011-10-02 9 views
6

私の目標は、foo [bar]がtype1を返し、foo [bar]がreturn2を返すようにすることです。複数の演算子のオーバーロード

私はC++でオブジェクトを書いていますが、かなりうまくいくようになっていますが、ほんの少し小さなものしかできませんが、不可能と思われます。

私のオブジェクトはストレージクラスなので、配列の添字を使って値にアクセスしています。私も割り当てる必要があるので、=演算子もオーバーロードします。しかし、私のクラスが保持する値はファーストクラスのオブジェクトであるため、多少不便です。配列の添え字のオーバーロードでは、そのまま返すことはできません。私は=演算子を処理するために中間クラスを返さなければならないが、追加の型付けなしで値を取得したい。

これを行う方法はありますか?ハッキリとしたやり方が受け入れられる。

編集:ここでは、それが再び

#include<cstdio> 
#include<cstdlib> 

class foo{ 
    char* a[100]; 
    foo(){ 
     for(int i = 0; i < 100; i ++) 
      a[i] = 0; 
    } 
    char* operator[] (int location){ 
     return a[location]; 
    } 
    foo& operator[]= (int location, const char* value){ 
     if(a[location] == 0) 
      a[location] = (char*) malloc(strlen(value) + 1); 
     else 
      a[location] = (char*) realloc(a[location], strlen(value) + 1); 
     strcpy(a[location], value); 
    } 
}; 
int main(){ 
    foo bar; 
    bar[20] = "Hello"; 
    printf("bar[20] = %s\n", bar[20]); 
    bar[20] = "Hello There"; 
    printf("bar[20] = %s\n", bar[20]); 
    printf("bar[20][0] = %c\n", bar[20][0]); 
} 

Output: 
bar[20] = Hello 
bar[20] = Hello There 
bar[20][0] = H 

編集を行う(必要がある)ものの例です:私は、私は違うが、実行可能な方法でこれをフレージングてみようと思います。クラスが参照されるときに戻り値の型をオーバーロードする方法はありますか?そのような場合私が持っている場合

class foo{ 
    bool a; 
    bool operator /*referenced*/(){ 
     return a 
    } 
    foo& operator=(bool b){ 
     a = b; 
    } 
}; 
int main(){ 
    foo a; 
    a = b; 
    if(a == b) 
     printf("It Works!"); 
} 

実際には動作しますか?

+0

あなたがしようとしているかを示したコードのビットを与えることができます何をする? –

+0

Theres an example – Kaslai

答えて

5

operator[]=はありません。そのため、解決策は、値をとり親コンテナに設定するoperator=の2種類のラッパークラスを記述することです。暗黙の変換演算子は、親コンテナを返し、それを返します。 operator[]はそのようなラッパーを返します。 2番目の質問については

class foo 
{ 
    friend class wrapper; 
public: 
    class wrapper 
    { 
     friend class foo; 
     foo & _parent; 
     int _index; 

     wrapper(foo & parent, int index) : _index(index), _parent(parent) {} 
    public: 
     wrapper & operator=(const char * value) 
     { 
      if(_parent.a[_index] == 0) 
       _parent.a[_index] = (char*) malloc(strlen(value) + 1); 
      else 
       _parent.a[_index] = (char*) realloc(_parent.a[_index], strlen(value) + 1); 
      strcpy(_parent.a[_index], value); 

      return *this; 
     } 

     operator char *() 
     { 
      return _parent.a[_index]; 
     } 
    }; 

    char* a[100]; 
    foo() 
    { 
     for(int i = 0; i < 100; i ++) 
      a[i] = 0; 
    } 
    wrapper operator[] (int location){ 
     return wrapper(*this, location); 
    } 
}; 

、よく、あなたは常にfoooperator==をオーバーロードできます。しかし、私は誤解しているかもしれません。

+0

それは私が設定したシステムですが、それは追加のタイピングをしなければならないバグです。 C++はCよりも抽象度が高いですが、抽象化されていないと思います。まあ、あなたの人の入力のおかげで。 (別の答えがありましたが、彼は彼の投稿を削除しました) – Kaslai

+0

@Aslai:私はあなたがあなたがそれを使っている余分なタイピング*を意味すると思っていました。 C++で「使いやすい」クラスを作成したいときは、しばしば、実際には醜いものを書くことを意味します。 –

+0

私はあなたが使用している場所を正確に*意味していました。キャストまたは(de)参照など、値を取得するには演算子を追加する必要があります。 – Kaslai

0

あなたがC++を(あなたのタグが示唆するように)を使用して喜んでいる場合は、作業のほとんどは、あなたのために行われています

class foo: public vector<string> 
{ 
public: 
    foo() 
    { 
    resize(100); 
    } 
}; 

int main() 
{ 
    foo bar; 

    bar[20] = "Hello"; 
    cout << "bar[20] = " << bar[20] << endl; 
    bar[20] = "Hello There"; 
    cout << "bar[20] = " << bar[20] << endl; 
    cout << "bar[20][0] = " << bar[20][0] << endl; 
} 
関連する問題