8

クラスに Swap() メソッドを実装して (A と呼びましょう)、copy-and-swap operator=() を作成したいと考えています。私の知る限り、swap メソッドは、クラスのすべてのメンバーを交換することによって実装する必要があります。次に例を示します。

class A 
{
  public:
    void swap(A& rhv) 
    {
        std::swap(x, rhv.x);
        std::swap(y, rhv.y);
        std::swap(z, rhv.z);
    }
  private:
    int x,y,z;
};

しかし、const メンバーがある場合はどうすればよいでしょうか? std::swap を呼び出すことができないため、A::Swap() をコーディングできません。

編集: 実際、私のクラスはもう少し複雑です。私はそれをシリアライズおよびデシリアライズしたい。Const メンバーは、このオブジェクト内で変更されないデータ (ID など) です。だから私は次のようなものを書くことを考えていました:

class A
{
  public:
    void Serialize(FILE* file) const
    {
        fwrite(&read_a, 1, sizeof(read_a), file);
    }

    void Deserialize(FILE* file) const
    {
        size_t read_a;
        fread(&read_a, 1, sizeof(read_a), file);
        A tmp(read_a);
        this->Swap(tmp);
    }

 private:
   const size_t a;
};

そして、このコードを呼び出します:

A a;
FILE* f = fopen(...);
a.Deserialize(f);

あいまいな表現で申し訳ありません。

4

7 に答える 7

10

本当に欲しいのは、オブジェクト間で簡単に交換できる内部データ構造を持つことだと思います。例えば:

class A 
{
   private:

     struct A_Data {
       int x;
       int y;
       const int z;

       A_Data(int initial_z) : z(initial_z) {}
    };

    std::auto_ptr<A_Data> p_data;

  public:

     A(int initial_z) : p_data(new A_Data(initial_z)) {}

     void swap(A& rhv) {
        std::swap(p_data, rhv.p_data);
     }
};

これzにより、オブジェクトの内部データのインスタンス内で値が一定に保たれますが、 const-correctnessに違反することなく、 A2つのオブジェクトの内部データA(定数値を含む)を交換できます。z

于 2010-02-05T21:19:00.527 に答える
5

おやすみなさいの睡眠の後、最良の答えは、const値への非constポインタを使用することだと思います-これらはすべて、キャプチャしようとしているセマンティクスです。

于 2010-02-06T12:11:56.637 に答える
3

f0b0s、優れた設計原則は、オブジェクトを不変になるように設計することです。これは、一度作成したオブジェクトは変更できないことを意味します。オブジェクトを「変更」するには、オブジェクトをコピーし、必要な要素を必ず変更する必要があります。

そうは言っても、この場合は、代わりにコピーコンストラクターを使用して、交換するオブジェクトをコピーしてから、実際にオブジェクトへの参照を交換する必要があります。内部でオブジェクトの要素を変更できるようにしたいと思うことは理解できますが、オブジェクトのコピーを作成し、代わりにそのオブジェクトへの参照をNEWオブジェクトに置き換える方がよいでしょう。これにより、あらゆる不便を回避できます。

お役に立てれば。

于 2010-02-05T21:20:27.560 に答える
1

インスタンスへのポインタを使用することをお勧めします。classポインターは、またはのデータよりもはるかに簡単に交換できますstruct

定数値を交換する唯一の方法は、別のオブジェクトまたはclone現在のオブジェクトを作成することです。

構造体を考えると:

struct My_Struct
{
  const unsigned int ID;
  std::string        name;
  My_Struct(unsigned int new_id)
    : ID(new_id)
  { ; }
};

私の理解では、上記のようなもののインスタンスを交換したいということですMy_Struct。変更可能な (非定数) メンバーはコピーできますが、メンバーはコピーできませんconst。メンバーを変更する唯一の方法は、constメンバーの新しい値で新しいインスタンスを作成することconstです。

おそらく、設計を再考する必要があります。

于 2010-02-05T21:22:53.280 に答える
0

私見では、CONSTメンバーを交換しないことを検討する必要があります。

PD: アプローチにリフレクションを使用することを検討できると思います。そのため、機能を維持する必要はありません。

于 2010-02-05T21:37:42.197 に答える
0

これが作成された理由const_castです。足を撃ち落とさないように注意してください。

編集: OK、認めます - const_cast はこの問題のために作成されたものではありません。これはあなたのコンパイラでうまくいくかもしれませんが、あなたはそれを当てにすることはできません.悪魔があなたの鼻孔から飛び出しても、私を責めないでください.

于 2010-02-05T21:06:39.600 に答える