Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以在不手动分配所有成员的情况下选择要分配一个实例的哪些成员_C++_Class - Fatal编程技术网

C++ 有没有一种方法可以在不手动分配所有成员的情况下选择要分配一个实例的哪些成员

C++ 有没有一种方法可以在不手动分配所有成员的情况下选择要分配一个实例的哪些成员,c++,class,C++,Class,假设C类的成员是x,y,z,t,u,v 这段代码可以压缩成只列出x,u,v吗 编辑:动机是我有一个更新了的类,但有些值没有再次计算,因为它们保持不变。您可以选择重载=运算符。见: 或者,您可以定义一个C类的成员函数来完成c1之类的工作。copyc2有一个复制构造函数或重载=运算符 编辑: 共享一个C示例,因为它需要.Net Framework和公共属性,所以可能并不适合您。但这本书既快又可读 using Newtonsoft.Json; using ... class Z { publ

假设C类的成员是x,y,z,t,u,v

这段代码可以压缩成只列出x,u,v吗


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

您可以选择重载=运算符。见:

或者,您可以定义一个C类的成员函数来完成c1之类的工作。copyc2有一个复制构造函数或重载=运算符

编辑: 共享一个C示例,因为它需要.Net Framework和公共属性,所以可能并不适合您。但这本书既快又可读

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
        ...
    }
    ...
}
我们甚至可以在这个库中使用模板。我们使用它们将模型值从一个对象复制到另一个对象。这可能不适用于您的情况,因为模型大多具有公共属性,而这里可能不是这种情况。我没有与私有或受保护的数据成员进行检查

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

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


当然,如果您的语义不是赋值的语义,您可以创建一个传统的方法AssignSomeFieldsconst C&other。然后只需调用c1.AssignSomeFieldsc2

如果您试图将其压缩到一行,并且不能重载运算符=,那么您可以使用std::tie,假设您有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=如果它确实具有赋值语义,这意味着在更新之后,两个对象在语义上是相等的。 如果它没有赋值语义,那么应该使用一个普通的命名成员函数,其中的名称应该很好地描述更新的含义。在这种情况下,您必须在该更新函数中进行memberwise赋值:

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。

您有副本构造函数吗?您可以使用指向成员对象的指针来做一些事情,但我不认为这是一个很大的改进;检查这个@theghostofc我有抄送,但我不想破解它,除此之外它仍然是相同数量的code@R.MartinhoFernandes让c2,c2.x,c2.u.c2.v计算类中的偏移量,得到c1的成员,然后分配它们怎么样。你知道你在做什么,因为它是同一个类,所以你可以使用decltype并在一些偏移上进行转换…c1.x=c2.x;c1.u=c2.u;c1.v=c2.v;也是一行-这样做不会带来任何好处,只会失去可读性,因为分配给彼此的元素现在是分离的,错误更难找到。
class C {
  struct SomePart {
    int x;
    double u;
  };

  SomePart sp;
  bool z;

  void updateSomeParts(C const& other) { sp = other.sp; }
};