是否有一种方法可以选择我想要分配的一个实例的成员,而无需手动分配它们

Is there a way to select what members of one instance I want to assign without manually assigning them all

本文关键字:分配 实例 成员 一个 方法 一种 选择 选择我 是否 我想要      更新时间:2023-10-16

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

编辑:动机是,我有一个得到更新的类,但有些值不会再次计算,因为它们保持不变。

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

但是,可以将封装在类的赋值操作符中。重载"="操作符,并将所有这些赋值放在它的主体中。然后你只需要做c1 = c2

当然,如果你的语义不是赋值的语义,你可以创建一个传统的方法AssignSomeFields(const C& other)。然后调用c1.AssignSomeFields(c2);

如果你想把它压缩成一行(你不能重载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 );

这不会使代码更小,只是把它放在一行,您可能会发现这样更方便。

如果C是一个有方法等等,你应该把你的成员变量设为私有而不是公共。话虽如此,从c2c1的更新必须作为成员函数实现。如果该成员函数确实具有赋值语义,则该成员函数应该是operator= ,这意味着更新后两个对象在语义上相等。
如果没有赋值语义,则应该使用普通的命名成员函数,其中的名称应该很好地描述更新的含义。在这种情况下,必须在update-function:

中进行成员赋值。
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

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

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

的工作。

设置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数据成员进行检查。

相关文章: