有没有办法选择我想要分配的一个实例的成员而无需手动分配它们

时间:2013-06-21 12:22:06

标签: c++ class

我们假设我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吗?

编辑:动机是我有一个更新的类,但由于它们保持不变,因此不再计算某些值。

5 个答案:

答案 0 :(得分:5)

使用任何合理的方法(即避免使用宏和模糊机制),代码不能压缩

但是,它可以在您的类的赋值运算符中封装。重载“=”运算符并将所有这些赋值放在其正文中。那你只需要做c1 = c2。

当然,如果您的语义不是赋值语义,则可以创建传统方法AssignSomeFields(const C& other)。然后拨打c1.AssignSomeFields(c2);

答案 1 :(得分: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 );

这不会使代码变小,只需将其放在一行,您可能会觉得更方便。

答案 2 :(得分:1)

如果C是带有方法等的,则应该将您的成员变量设为私有而不是公共变量。话虽如此,从c2c1的更新必须作为成员函数实现。如果成员函数确实具有赋值语义,则该成员函数应为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; }
};

但是,您现在必须明确访问sp的成员,例如sp.u = 5,而不仅仅是u = 5

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

拥有copy constructor或超载= operator

编辑:

分享C#示例,这可能不适合您,因为它需要.Net Frameworkpublic 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数据成员进行检查。