Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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,直接问题:一个类对象有三个(或更多)几乎相同的副本,如何最好(或最有效)地存储它们之间的差异 背景:我有一个算法需要一组参数: struct params { std::string A; std::string B; double C; double D; userDefinedTypeDef S; }; 我想调用我的算法三次。第一次,C=3&S=foo。第二次,C=4&S=foo。第三次,C=4,S=bar。 现在给出的示例只是为了说明,真正的对象是一个类

直接问题:一个类对象有三个(或更多)几乎相同的副本,如何最好(或最有效)地存储它们之间的差异

背景:我有一个算法需要一组参数:

struct params
{
   std::string A;
   std::string B;

   double C;
   double D;

   userDefinedTypeDef S;
};
我想调用我的算法三次。第一次,C=3&S=foo。第二次,C=4&S=foo。第三次,C=4,S=bar。 现在给出的示例只是为了说明,真正的对象是一个类,而不是一个结构,并且有几百个成员。我还想多次调用该算法,所以我不想让这个对象的额外副本到处运行。那么,仅存储两个类对象之间的差异的最佳模式/实现/方法是什么

换句话说,除了C=4之外,我如何存储“对象2与&(对象1)相同”

编辑:如下面的注释所述,我确实希望避免更改函数调用以及参数类对象或成员对象的数组。我这样做的目的是保留一个副本,即ala“currentParam”,然后保留连续调用之间差异的列表。这样,我可以简单地更新更改的值,保留所有其他值不变,并使用给定的函数


也就是说,最简单的方法是什么?创建一个带有布尔标志“member1\u changed”的类?然后使用工会?我被卡住了--一直对稀疏矩阵存储以及它之间的关系感到困惑--因此我问了这个问题。

几百个成员?这听起来像是一个糟糕的设计从一开始就给我。我甚至想不出一个我能描述的需要这么多东西的物体。我能想到一个系统,它可以。但公平地说,我不是在批评你,因为我甚至不知道这是不是你最初写的。我将研究如何智能地将类拆分为子类,甚至将数据分组为更好的表示形式。这是第一次开始

在此之后,我还将考虑重写函数,使其只接受其操作的参数:

void foo(Bar _objectWithTonsOfMembers){ //stuff...
进入

完成后,您可以考虑使用不同的参数处理请求。在准确处理这些类型的情况时,结合帮助:

boost::function<void(int,double)> refinedFoo = boost::bind(foo, _1, _2, 4.09, Customer("Pam"));
refinedFoo(1, 3.0);
refinedFoo(2, 2.0);
boost::function-refinedFoo=boost::bind(foo,_1,_2,4.09,Customer(“Pam”);
精炼的foo(1,3.0);
精炼的foo(2,2.0);
现在,我可以很容易地调用我想要的函数,只使用正在更改的参数

编辑

为了澄清我的“子类”是什么意思,我指的不是继承,而是结构。因此,我希望您将一些类“Foo”放入一个由Bar、Baz、Biff和Bam类组成的组合中。在代码中使用这些元素时,应该将它们分解为逻辑元素

我的意思是,如果你有一个只运行4个成员变量的函数,而这些成员变量通常都是以相同的方式运行的,那么这是一个创建新类或结构的好地方。

你可能会感兴趣。它是专门为解决您的问题而设计的

这里有一种存储差异的方法:

步骤1:用指向成员的指针替换所有成员。是的,这会增加一点内存开销

步骤2:让类存储共享成员的浅拷贝而不是深拷贝

如果您的类不是不变的,那么这种技术会变得更加复杂,尽管基本思想仍然可行


请注意,这确实会减少内存占用,但也会减少内存引用的空间局部性。这可能会显著降低您的程序速度。它还增加了一个额外的间接层。

我可能把事情简化了一点。是的,我不想复制的对象实际上有八个子类(A、A2、B、B2、C、D、E、F),其中A2派生自A,B2派生自B,等等。该算法是一个统计采样器,实际上只需要一个或两个子类,每个子类在后续调用中可能有所不同。我基本上没有修改函数的灵活性,但同样地,我不希望将所有子类成员都转换为数组。@M.Tibbits当我说子类时,我不是指继承,尽管这与我的回答很难区分。我的意思是把A分成几个不同的类,这样A就是这些类的组合。让我编辑我的答案来澄清。我相信我理解你的意思,但让我提供更多的信息——在我的参数对象(a、A2、B、B2、C、D、E、F)中,F只是一个typedef‘algType’,并且基于算法类型,函数Sample(param)调用一个不同的采样器,它需要一个子类:a、A2、B、B2、C、D,或者E.在连续的类之间,a的成员可能不同,F可能会改变,或者B的全部都会改变--但是我问问题的方式是B/c我不能改变函数定义,我不想改变组合来容纳a,A2等的数组。我可以改变子类来容纳数组A2.member1[call1]并为每个调用使用一个索引,但我真的很犹豫这样做,因为几乎所有的子类成员都可以在函数调用之间更改,我希望避免数组。也可能是相关的。你对这些物体了解多少?您是从一些输入读取连续的完整对象并计算增量,还是直接读取增量?如果您只希望在内存中有一个完整的对象,并且希望保留顺序,那么每个增量都必须来自上一个对象。您可以合理地将每个增量编码为(fieldid+boost::any或variant或home spin union)的容器,并在类中提供相应的更新函数
boost::function<void(int,double)> refinedFoo = boost::bind(foo, _1, _2, 4.09, Customer("Pam"));
refinedFoo(1, 3.0);
refinedFoo(2, 2.0);