0

オーバーロードに大きな問題がありますが[]、例に示されているとおりに使用しましたが、機能しません。コンパイラーにも表示されません。

エラーが発生します:

'std::cout << * moj の 'operator<<' に一致しません

2 つ目の問題は、コピー コンストラクトを使用しても、元のオブジェクトを削除すると、コピーされたオブジェクトが消えてしまうことです。しかし、デストラクタプログラムを追加すると、クラッシュするだけです。

C:\Documents and Settings\Duke\Moje dokumenty\MaciekK\String\main.cpp|90|error: no match for 'operator<<' in 'std::cout << * moj'|
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstring>
using namespace std;

class String{
public:
 char* napis;
 int dlugosc;

    char & operator[](int el) {return napis[el];}
    const char & operator[](int el) const {return napis[el];}
    String(char* napis){
    this->napis = napis;
    this->dlugosc = this->length();
 }

String(const String& obiekt){

    int wrt = obiekt.dlugosc*sizeof(char);
    //cout<<"before memcpy"<<endl;
    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;
}



 };




int main()
{

String* moj = new String("Ala ma kota");
 //  cout<< moj[0] <<endl;  // I GETT ERROR NO MATH FOR OPERATO<< IN STD:: COUTN<< * MOJ
String* moj2  = new String(*moj);

moj->show();
delete moj;
moj2->show();
return 0;
}
4

2 に答える 2

1

問題は、それmojがであり、String *ではないということStringです。したがって、moj[0]を呼び出さずoperator <<、ポインタを逆参照するだけです。

于 2012-05-26T11:02:23.577 に答える
1

あなたの問題は次のとおりです。

メモリ割り当て関数によって返されないアドレスで割り当て解除関数を呼び出すことは、未定義の動作です。を使用してメモリを割り当てることはありませんが、destructor( ) でnew []呼び出すため、コードに未定義の動作があります。 delete []delete[] this->napis;

コンストラクターとコピー コンストラクターを正しく実装していません。
コンストラクターとコピーコンストラクターで動的メモリを割り当てる必要があります。現在、コンストラクターでメモリを割り当てず、コピー コンストラクターでディープ コピーの代わりに浅いコピーを実行します。

あなたが持っている必要があります:

String(char* napis)
{
    //I put 20 as size just for demonstration, You should use appropriate size here.
    this->napis = new char[20];   <-------------- This is Important!
    memcpy(this->napis,napis,12);
    this->dlugosc = this->length();
}

String(const String& obiekt)
{

    int wrt = obiekt.dlugosc*sizeof(char);
    this->napis = new char[wrt];  <-------------- This is Important!
    memcpy(this->napis,obiekt.napis,wrt);
    this->dlugosc = wrt/sizeof(char);
}    

deleteまた、プログラムの最後でメモリリークをmoj2避けるために呼び出す必要があります。

delete moj2;

これは、上記の変更を加えたプログラムのオンライン バージョンであり、問​​題なく動作します

于 2012-05-26T12:04:19.893 に答える