我们假设我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
吗?
编辑:动机是我有一个更新的类,但由于它们保持不变,因此不再计算某些值。
答案 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是带有方法等的类,则应该将您的成员变量设为私有而不是公共变量。话虽如此,从c2
到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
。
答案 3 :(得分:0)
您可以选择重载=
运算符。请参阅:http://www.cplusplus.com/doc/tutorial/classes2/
或者,您可以定义班级C
的成员函数,为您完成工作c1.copy(c2)
答案 4 :(得分: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
,这可能不是这里的情况。我没有使用private
或protected
数据成员进行检查。