假设我有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
to的更新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; }
};
但是,您现在必须显式访问 的成员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
数据成员。