3

Class Cメンバーがいると仮定しましょうx,y,z,t,u,v

C c1,c2;
//... 
c1.x = c2.x;
c1.u = c2.u;
c1.v = c2.v;

リストできるように、このコードを要約できますx, u, vか?

編集:動機は、更新されるクラスがあることですが、一部の値は同じままであるため、再度計算されません。

4

5 に答える 5

5

コードは、合理的な方法 (つまり、マクロやあいまいなメカニズムの回避)で圧縮することはできません。

ただし、クラスの代入演算子にカプセル化できます。「=」演算子をオーバーロードし、それらすべての代入をその本体に入れます。次に、c1 = c2 を実行するだけです。

もちろん、セマンティクスが割り当てのセマンティクスでない場合は、従来のメソッドを作成できますAssignSomeFields(const C& other)。次に、 を呼び出しますc1.AssignSomeFields(c2);

于 2013-06-21T12:26:35.407 に答える
3

それを 1 行に要約しようとしている場合 (そして をオーバーロードできない場合)、 C++11 を持っていると仮定して見つかったをoperator=使用できます。std::tie<tuple>

次のように使用できます。

C c1, c2;
...
std::tie( c1.x, c1.u, c1.v ) = std::tie( c2.x, c2.u, c2.v );

これはコードを小さくするわけではなく、コードを 1 行にまとめただけで、より便利になるかもしれません。

于 2013-06-21T12:27:34.393 に答える
1

C がメソッドなどを持つクラスである場合、メンバー変数を public ではなく private にする必要があります。そうは言っても、からc2への更新c1はメンバー関数として実装する必要があります。このメンバー関数はoperator= 、実際に代入セマンティクスを持っている場合、つまり、更新後に 2 つのオブジェクトが意味的に等しい場合は、そうである必要があります。代入セマンティクスがない
場合は、通常の名前付きメンバー関数を使用する必要があります。名前は、更新の意味を適切に説明する必要があります。その場合、その更新関数でメンバーごとの割り当てを行う必要があります。

void C::updateSomeParts(C const& other) {
  x = other.x;
  u = other.u;
  v = other.v;
}

x、u、および v を 2 回書きたくない場合や、別の機会に同じ部分を使用する可能性がある場合は、それらをサブオブジェクトにまとめることを検討する必要があります。

class C {
  struct SomePart {
    int x;
    double u;
  };

  SomePart sp;
  bool z;

  void updateSomeParts(C const& other) { sp = other.sp; }
};

ただし、 のメンバーだけでなくsp、 のように明示的にアクセスする必要があります。sp.u = 5u = 5

于 2013-06-21T12:42:06.460 に答える
0

copy constructorまたは をオーバーロードします= operator

編集:

C#必要なため、実際には機能しない可能性のある例を共有.Net Frameworkしますpublic Properties。しかし、これは速くて読みやすいです。

using Newtonsoft.Json;
using ...

class Z
{
    public int x {get; set;}
    public string u {get; set;}
    public string w {get; set;}
    ...
}
class C
{
    public int x {get; set;}
    public string u {get; set;}
    public string v {get; set;}
    ...
}
class Conversion
{
    public void Convert()
    {
        C c1, c2;
        ...
        ...
        string data = JsonConvert.SerializeObject(c1);
        c2 JsonConvert.DeserializeObject<C>(data);  // copies all public properties from c1 to c2

        Z z1;
        ...
        ...
        data = JsonConvert.SerializeObject(c1);
        z1 JsonConvert.DeserializeObject<Z>(data);  // copies value for only matching properties
        ...
    }
    ...
}

このライブラリでテンプレートを使用することもできます。これらを使用して、あるオブジェクトから別のオブジェクトにモデル値をコピーしました。モデルはほとんどpublic propertiesの場合、ここでは当てはまらない可能性があるため、これはあなたのケースには当てはまらない場合があります。privateまたはprotectedデータメンバーで確認していません。

于 2013-06-21T12:26:08.183 に答える