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

如果您试图将其压缩到一行(并且您不能重载operator=),那么您可以使用std::tie,<tuple>假设您拥有 C++11。

你可以像下面这样使用它:

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

这不会让代码变小,只是放在一行,你可能会觉得更方便。

于 2013-06-21T12:27:34.393 回答
1

如果 C 是具有方法等的,则应将成员变量设为私有而不是公开。话虽如此,从c2to的更新c1必须作为成员函数来实现。这个成员函数应该是operator= 如果它真的有赋值语义,这意味着更新后两个对象在语义上是相等的。
如果它没有赋值语义,您应该使用普通的命名成员函数,其中名称应该是对更新含义的良好描述。在这种情况下,您必须在该更新函数中进行成员分配:

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

如果你不想写两次 x,u 和 v 并且可能在其他场合使用相同的部分,你应该考虑将它们收集在一个子对象中:

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

  SomePart sp;
  bool z;

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

但是,您现在必须显式访问 的成员spsp.u = 5而不仅仅是u = 5.

于 2013-06-21T12:42:06.460 回答
0

您可以选择重载=运算符。见:http ://www.cplusplus.com/doc/tutorial/classes2/

或者,您可以定义该类的成员函数C来为您完成工作c1.copy(c2)

于 2013-06-21T12:24:51.053 回答
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情况可能并非如此。我没有检查过它privateprotected数据成员。

于 2013-06-21T12:26:08.183 回答