2

こんにちは、配列を含むクラスがあります。これをクラス コンストラクターに渡しません (ここで問題が発生する可能性がありますか?)。配列はクラスで定義され、読み取りメソッドで初期化されます。

しかし、主に次のようなクラスのインスタンスを作成します。

myClass myClass1;

次に、次のようにします。

myClass1 = myClass2;

ここで、次のような最初のクラス インスタンスでバブル ソート メソッドを使用します。

MyClass1.sort();

これらのインスタンスの両方を並べ替え後にテキストに書き出すと、両方とも並べ替えられますか?

浅いコピーと深いコピーを読みましたが、浅いコピーの後に呼び出されたメソッドが両方ともソートされる理由がわかりませんか? これは予想される動作ですか?

もう少し情報:

私のクラスでは、配列を次のように定義します。

static string myArray[5];

次に、書き込みメソッドで5つの要素を書き込みます。これを行うより良い方法はありますか?ただし、メソッドを使用して初期化する必要があります。

4

2 に答える 2

3

アレイはどのように定義/作成されていますか?を使用して作成newし、ポインターを使用して参照する場合は、ディープコピーを作成するカスタムコピーコンストラクターが必要になります(つまり、配列の新しいインスタンスを作成し、その内容をコピーします)。デフォルトのコピーコンストラクターはシャローコピーのみを実行するため、両方のインスタンスが同じメモリを使用します(つまり、両方のポインターがヒープ上の同じ配列を指します)。

これは、デフォルトのコピーコンストラクターで機能します。

class myclass {
    char text[256];
}

これは、デフォルトのコピーコンストラクターでは機能しません(少なくとも期待どおりではありません)。

class myclass {
    char *text;
    myclass() : text(new char[256]) {}
    ~myclass() { delete [] text; }
}

として定義されたメンバーstaticはコピーされません。すべてのインスタンスは、追加のコードを必要とせずにそれを共有します。

class myclass {
    static char text[256];
}

2番目のケースのコピーコンストラクターは次のようになります(これは単純化されており、有効な値などをチェックしていないことに注意してください)。

myclass(const myclass &base) : text(new char[256]) { strcpy(text, base.text); }

一般的な経験則:いくつかの戻り値が割り当てられているポインターメンバーを使用しますかnew?その場合は、コピーコンストラクターを作成します。そうでない場合は、デフォルトのものを使用します(他の理由がない限り)。

于 2012-03-17T10:54:25.637 に答える
2

私のクラスでは、配列を次のように定義しています。

static string myArray[5];

cppファイルでのみ宣言されているので、ヘッダーで宣言する必要がありますか?まだ両方をコピーしているので。

クラス定義の外でそれを宣言すると、それはグローバル変数になります。そのインスタンスは1つだけです。クラス内で宣言する必要があります。宣言する必要はありません static

class MyClass1 {
    // other things...
    string myArray[5];
};

いずれにせよ、この種の基本的な質問は、優れたC++入門書を参照することでより適切に回答できます。

于 2012-03-17T11:04:39.393 に答える