Я пишу код на 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
s по ссылке; в противном случае деструктор будет вызван в конце любой функции, получившей Measurement
, и следующая попытка что-либо сделать с одной из гистограмм приведет к сбою.
Спасибо всем за ответы!