是否有一种方法可以选择我想要分配的一个实例的成员,而无需手动分配它们
Is there a way to select what members of one instance I want to assign without manually assigning them all
假设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
数据成员进行检查。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 我想知道我是否可以将一个类分配给特定的成员数据并创建该类的实例
- 是否应该使用继承来减少内存消耗的实例的内存分配?
- 使用 pybind11 包装C++分配的实例
- 如何在C++中动态分配全局字符数组中的类实例?
- 如何在C++中将类的实例完全重新分配给同一类的另一个实例(然后删除原始对象)?
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 将来自类的特定实例的函数分配给变量以保持状态
- 当指针指向的对象被另一个类的实例删除时,重新分配指针
- 将成员函数分配给实例成员的属性
- 如何将内存分配给具有数组成员的类的实例
- (C++)用于实例化新对象并将其分配给指向相同对象类型的指针的 2D 向量的语法
- 删除C++中动态分配的类实例
- 如何超载分配运算符,该操作员总计两个实例变量
- C++:通过从映射向量分配映射实例来填充映射的映射
- 分配给匿名实例的基元类型的默认构造函数
- 派生类的实例化是否为基类的私有成员分配内存
- 如何在不调用C++中的构造函数的情况下分配实例变量