假设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是一个类有方法等等,你应该把你的成员变量设为私有而不是公共。话虽如此,从c2
到c1
的更新必须作为成员函数实现。如果该成员函数确实具有赋值语义,则该成员函数应该是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 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
数据成员进行检查。