Защитите отдельные значения в std::array, позволяя при этом полную перезапись.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Защитите отдельные значения в std::array, позволяя при этом полную перезапись.

Сообщение Anonymous »


У меня есть массив с глобальным состоянием. Это работает во встроенной среде/микроконтроллере, а не в большом приложении, где меня больше беспокоило бы глобальное состояние.

Как я могу объявить массив так, чтобы его члены не могли быть изменены, но при этом я мог обновить копию и при этом полностью перезаписать глобальный массив, когда это необходимо?

Я заинтересован в использовании неизменяемого массива, чтобы можно было быстро проверить, изменился ли он, когда он возвращается из функции мутации. То есть если адрес памяти изменился, то я знаю, что его скопировали и обновили.

Если он был обновлен, я хочу перезаписать исходный глобальный массив обновленной версией.

Однако я хочу защитить отдельные значения массива от случайной перезаписи в main() или от случайного доступа к глобальному массиву и его непосредственного обновления. Возможно, я параноик, но ради вопроса скажем, что это вполне обоснованная проблема.

Единственные обновления, которые должны быть возможны, должны выполняться через обновление копии/адреса.

Эта версия работает, но можно получить доступ к глобальному массиву и напрямую обновить его:

#include #include std::array arr = {1, 2, 3}; // глобальный массив std::array const * mutate(std::array const * ptr) { // (*ptr)[2] = 9; // Мне нравится, как это предотвращается с помощью const // возвращаем ПТР; // раскомментируем, чтобы проверить отсутствие мутаций // мутация посредством копирования, сохранение нового массива в куче std::array * ret = new std::array; std::copy((*ptr).begin(), (*ptr).end(), (*ret).begin()); (*рет)[0] = 9; вернуть возврат; } интервал основной() { std::array const * retPtr = mutate(&arr); если (retPtr == &arr) { std::cout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»