Работа с трудно избежать большого количества членов const в классе C++

Это дополнительный вопрос к моему предыдущему вопросу:

Инициализировать члены const с помощью сложной функции в классе C++

Короче говоря, у меня есть программа с классом Grid, который содержит свойства трехмерной сетки. Я хотел бы, чтобы свойства этой сетки были доступны только для чтения после создания, чтобы сложные функции внутри класса не могли случайно испортить сетку (например, if(bla = 10), вместо if(bla == 10)) и т. д. На этот вопрос был дан хороший ответ в предыдущем обсуждении: вызов списков инициализатора через функцию создания.

Вот моя новая проблема. My Grid имеет множество свойств, которые просто описывают сетку (количество точек сетки, координаты в точках сетки и т. д.), для которых просто не имеет смысла перераспределять их между разными объектами. Тем не менее, основные учебники по C++ всегда связывают функции с большим количеством параметров с плохим дизайном, но мне они нужны, чтобы иметь возможность иметь константные переменные-члены.

Существуют ли какие-либо стандартные методы решения таких проблем?


person Chiel    schedule 03.08.2014    source источник
comment
Должны ли все переменные быть членами класса Grid? Разве вы не можете разделить функциональность на несколько классов, где каждый подкласс обрабатывает подмножество текущего класса Grid?   -  person Some programmer dude    schedule 03.08.2014
comment
Переменные — это просто свойства этой сетки. Разделение их было бы довольно искусственным.   -  person Chiel    schedule 03.08.2014


Ответы (1)


Ответ зависит от того, что вы пытаетесь защитить.

  1. Если вы пытаетесь гарантировать, что пользователи класса не смогут непреднамеренно изменить критические параметры, то способ сделать это состоит в том, чтобы объявить эти члены как private или protected и предоставить const геттеры только в том случае, если они нужны вообще вне реализации класса.

  2. Если вы пытаетесь гарантировать, что разработчик класса Grid не изменит эти значения, есть несколько способов сделать это. Один простой способ — создать подкласс, который содержит только эти параметры, и тогда ответ будет выглядеть как 1. Другой способ — объявить их const, и в этом случае они должны быть инициализированы при создании экземпляра Grid.

Если ответ равен 2, то есть и другие вещи, которые можно сделать, чтобы предотвратить непреднамеренное изменение критических значений. Пока вы пишете и тестируете реализацию класса, вы можете временно использовать фиксированные фиктивные значения const для критических параметров, гарантируя, что другие написанные вами функции не смогут изменить эти значения.

Еще один прием, позволяющий избежать ошибки if (i=7) ..., когда вы хотели написать if (i == 7) ..., заключается в том, чтобы всегда ставить константу первой. То есть написать if (7 == i) .... Кроме того, любой приличный компилятор должен иметь возможность помечать предупреждения об ошибках такого рода — убедитесь, что вы используете эту функцию, включив все предупреждения и отчеты об ошибках, предоставляемые вашим компилятором.

person Edward    schedule 03.08.2014
comment
Ответ 2. и тогда мы точно вернулись к моему вопросу, к сожалению. - person Chiel; 03.08.2014
comment
@Chiel: я отредактировал свой ответ, чтобы охватить больше вариантов, относящихся к вашей ситуации. - person Edward; 03.08.2014