2012-03-17 7 views
2

こんにちは私は配列を含むクラスを持っています、私はこれを私のクラスのconstuctorに渡していません(ここで間違っている可能性がありますか?)配列は、クラス内で定義され、次にreadメソッドで初期化されます。コンストラクタをコピーするC++奇妙な振る舞い?

しかしメインに、私はクラスのインスタンスのような作り:

myClass myClass1; 

は、その後の操作を行います。

myClass1 = myClass2; 

は今、私のようなファーストクラスのインスタンス上のバブルソート方法を使用します

これらの両方のインスタンスをソート後にテキストに書き出すと、両方ともソートされますか?

私は浅いと深いcopysへの読書を持っていましたが、なぜ、浅いコピーの後に呼び出されたメソッドは、それらの両方がソートされる結果になるのか理解できません?これは期待される行動ですか?私は同じように配列を定義する私のクラスで

もう少し情報

static string myArray[5]; 

は、writeメソッドでは、私は、それまでの5つの要素を記述することのより良い方法がありますこれは、私はそれを初期化する方法を使用する必要があります。

+1

*関連する配列がありますか?*あなたは[ポインタを混乱させる配列]ではありませんか?(http://stackoverflow.com/a/1641963/46642)?この動作を示す小さな例を投稿すると助けになります。 –

+0

私にもっとコードを教えてください。あなたは他のどこかでぶち壊されていないことをどのように知っていますか? – ApprenticeHacker

+0

私はちょっとしたコードで自分の投稿を更新しますが、割り当てのためにあまりにも多くの投稿をしたくありません。私はそれがもっとコードを投稿する必要があることを知っていますが! – rx432

答えて

2

ように私はちょうど配列を定義:そのだけのcppファイルで宣言されているよう

static string myArray[5]; 

は、私は、ヘッダーにそれを宣言する必要がありますか?それはまだ両方のコピーとして。

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

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

いずれの場合も、基本的な質問のこの種は、より良いa good C++ introductory bookを調べることによって答えています。

+0

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

+0

何ですか?クラスの中に*宣言する必要があります! –

+0

もちろん、ありがとうございます – rx432

3

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

これはデフォルトのコピーコンストラクタで動作します:

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

staticのように定義メンバー:これはデフォルトのコピーコンストラクタ(少なくともとして期待されていない)で動作しません

class myclass { 
    char text[256]; 
} 

決してコピーされません。すべてのインスタンスが必要さらに、コードなしでそれを共有:

class myclass { 
    static char text[256]; 
} 

を第二ケースのコピーコンストラクタは、この(これは簡略化され、有効な値と、そのようなチェックをされていません)のようになります。

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

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

+0

私の配列は以下のように定義されています:static string myArray [5]; – rx432

+0

静的メンバーは、クラスのすべてのインスタンス間で共有されます。各インスタンスに独自のコピーを持たせる場合は、 'static'キーワードを削除してください。 – Mario