gpt4 book ai didi

c++ - 初始化和维护结构的结构

转载 作者:太空狗 更新时间:2023-10-29 21:06:46 25 4
gpt4 key购买 nike

我正在编写 C++ 代码来处理一堆从实验室测量中填充的直方图。当我尝试更好地组织事情时遇到了问题,我认为我的问题来自对指针和/或结构的错误处理。

我最初的设计是这样的:

// the following are member variables
Histogram *MassHistograms[3];
Histogram *MomentumHistograms[3];
Histogram *PositionHistograms[3];

其中每个数组的元素 0 对应于一个实验室测量值,每个数组的元素 1 对应于另一个,依此类推。我可以通过 MassHistograms[0] 或类似方式访问各个直方图,并且工作正常.然而,这种组织方式对我来说似乎并不合适——如果我要执行新的测量,我必须向每个直方图数组添加一个元素。相反,我想到了

struct Measurement {
Histogram *MassHistogram;
Histogram *MomentumHistogram;
Histogram *PositionHistogram;
};

作为一个额外的复杂层,我进一步想根据对他们的数据所做的处理来捆绑这些测量,所以我做了

struct MeasurementSet {
Measurement SignalMeasurement;
Measurement BackgroundMeasurement;
};

我认为这种安排更合乎逻辑且可扩展——但它不起作用 ;-) 如果我有这样的代码

MeasurementSet ms;
Measurement m = ms.SignalMeasurement;
Histogram *h = m.MassHistogram;

然后尝试用 h 做一些事情,我得到了一个段错误。由于类似的代码之前运行良好,我假设我没有正确处理代码中的结构。具体来说,是否需要以任何方式显式初始化结构? (Histogram是别人库提供的,之前声明Histogram *SomeHistograms[4]就可以初始化了。)

感谢反馈。我对 Python 和 Clojure 相当熟悉,但我对 C++ 的有限了解并没有扩展到[看起来像是] 结构的护理和喂养的奥秘:-)


我最终做了什么

我将 Measurement 变成了一个成熟的类:

class Measurement {
Measurement() {
MassHistogram = new Histogram();
MomentumHistogram = new Histogram();
PositionHistogram = new Histogram();
};

~Measurement() {
delete MassHistogram;
delete MomentumHistogram;
delete PositionHistogram;
};

Histogram *MassHistogram;
Histogram *MomentumHistogram;
Histogram *PositionHistogram;
}

(我调用的通用 Histogram() 构造函数工作正常。)我遇到的另一个问题通过始终通过引用传递 Measurement 来解决;否则,析构函数将在接收到 Measurement 的任何函数的末尾被调用,并且下一次尝试对其中一个直方图执行某些操作将出现段错误。

谢谢大家的回答!

最佳答案

您确定 Histogram *SomeHistograms[4] 初始化了数据吗?如何填充直方图结构?

这里的问题不在于结构,而在于使您绊倒的指针。当您这样做时:MeasurementSet ms; 它声明了一个 MeasurementSet 类型的“自动变量”。这意味着 MeasurementSet 的所有内存都已“分配”并准备就绪。反过来,MeasurementSet 有两个 Measurement 类型的变量,它们也是“已分配”和“准备就绪”。反过来,测量有 3 个类型为 Histogram * 的变量,它们也是“已分配”和“准备就绪”……但是等等! “直方图 *”类型是一个“指针”。这意味着它是一个地址——一个描述实际内存位置的 32 位或 64 位(或任何位)值。就是这样。让它指向某物取决于你——把某物放在那个位置。在它指向任何东西之前,它里面会有真正的随机数据(或 0 出数据,或一些特殊的调试数据,或类似的东西) - 关键是如果你试图用它做某事,你会出现段错误,因为您可能会尝试读取您的程序不应该读取的部分数据。

在 C++ 中,结构与类几乎完全相同(在 Python 中具有类似的概念),您通常会像这样分配一个:

m.MassHistogram = new Histogram();

...之后,直方图就准备好了。然而,YMMV:你能自己配一个吗?或者你只能从某个图书馆获得一个,也许是从设备阅读等?此外,虽然你可以按照我写的去做,但它不一定“漂亮”。一个 c++-ic 解决方案是将分配放在构造函数中(如 python 中的 init)并在析构函数中删除。

关于c++ - 初始化和维护结构的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com