5

現在、C ++でオーバーロード演算子を練習していますが、問題があります。Stringクラスを作成しました。フィールドには、1つはchar配列、もう1つはlengthです。「アリスには猫がいます」という文字列があり、電話すると

cout<<moj[2];

'i'を取得したいのですが、今はmoj+16uアドレスのmoj+2 sizeof(String)を呼び出しています。

 cout<<(*moj)[2];

表示どおりに機能しますが、オーバーロードされた演算子定義で逆参照したいと思います。多くのことを試しましたが、解決策が見つかりません。訂正してください。

char & operator[](int el) {return napis[el];}
const char & operator[](int el) const {return napis[el];}

そしてコード全体、重要なことはページの下にあります。コンパイルして動作しています。

    #include <iostream>
   #include <cstdio>
   #include <stdio.h>
   #include <cstring>
  using namespace std;

 class String{
public:

//THIS IS  UNIMPORTANT------------------------------------------------------------------------------
char* napis;
int dlugosc;
   String(char* napis){
   this->napis = new char[20];
   //this->napis = napis;
   memcpy(this->napis,napis,12);
   this->dlugosc = this->length();
}

   String(const String& obiekt){
   int wrt = obiekt.dlugosc*sizeof(char);
   //cout<<"before memcpy"<<endl;
   this->napis = new char[wrt];
   memcpy(this->napis,obiekt.napis,wrt);

   //cout<<"after memcpy"<<endl;
   this->dlugosc = wrt/sizeof(char);
  }

   ~String(){
   delete[] this->napis;
   }

   int length(){
   int i = 0;
   while(napis[i] != '\0'){
       i++;
   }
   return i;
  }
        void show(){
      cout<<napis<<" dlugosc = "<<dlugosc<<endl;
 }


//THIS IS IMPORTANT
    char & operator[](int el) {return napis[el];}
    const char & operator[](int el) const {return napis[el];}
};


   int main()
   {

   String* moj = new String("Alice has a cat");
  cout<<(*moj)[2]; // IT WORKS BUI
 //  cout<<moj[2]; //I WOULD LIKE TO USE THIS ONE


   return 0;
   }
4

2 に答える 2

8
String* moj = new String("Alice has a cat");
cout<<(*moj)[2]; // IT WORKS BUI
//  cout<<moj[2]; //I WOULD LIKE TO USE THIS ONE

それはできません。後者の場合の添え字演算子はポインターに適用されます。引数の少なくとも1つがユーザー定義型(またはその参照であるがポインターではない)である場合にのみ、演算子をオーバーロードすることができます。この特定のケースでは、引数はString*2、両方とも基本的なタイプです。

あなたがするかもしれないことはポインタを完全に落とすことです、私はあなたがそれを必要とする理由がわかりません:

String moj("Alice has a cat");
// cout<<(*moj)[2]; <-- now this doesn't work
cout<<moj[2]; // <-- but this does
于 2012-06-02T22:06:05.510 に答える
3

String *を意味します。それ自体Stringで何かをしたい場合は、それを逆参照する必要があります。代わりにできることはこれです:String*moj

String moj = String("Alice has a cat"); // note lack of * and new
cout << moj[2];

また、割り当てたものはすべて、次のnew後に削除する必要があることに注意してください。

String *x = new String("foo");

// code

delete x;
于 2012-06-02T22:10:05.827 に答える