2

私は自分で文字列クラスを書いています。そして、私はСopyコンストラクターを書く方法を知りません。私はそのようなコードを持っています。

class S { 
         private:
            char *string;
            int l;
         public:   
            S::S(const S &s){
                 string = new char[l+1];
                 memcpy(string,s.string,l+1);
               }
};

Complierはエラーを出しませんでしたが、.exeは不明なエラーで閉じられました。main()関数で使用してみました。

S pop("Q6");
S str(pop);

だから私はあなたの助けを楽しみにしています。

4

4 に答える 4

8

コピーコンストラクターで

 string = new char[l+1]

l文字列の長さにまだ初期化されていないため、任意の値にすることができます。使用する前に(から値をコピーしてs.l)初期化する必要があります。

于 2012-10-12T12:18:28.647 に答える
3

コピーコンストラクターを作成したら、代入演算子とデストラクタも提供する必要があります。これは三つのルールとして知られています。

ただし、スマートポインターを使用する方がよいでしょう。そうすれば、それに注意を払う必要はなく、3のルールが0のルールになります。

また、初期化するのを忘れましたl。さらに、memcpyC++コードには実際の場所がありません。C関数(この場合は)ではなく、標準ライブラリアルゴリズムを使用しますstd::copy

于 2012-10-12T12:18:32.260 に答える
2

これを試して

public:
    S::S(const S &s) : l(s.l)
    {
        string = new char[l+1];
        memcpy(string,s.string,l+1);
    } 
于 2012-10-12T12:18:59.163 に答える
1

問題はにありl+1ます。l初期化されていません。使用する前に、のように割り当てる必要がありますl = s.l;

于 2012-10-12T12:19:19.423 に答える