Переменная, которая доступна только для чтения после присваивания во время выполнения? - PullRequest
8 голосов
/ 24 октября 2011

Совершенно новый программист здесь и заранее извиняюсь за глупые вопросы.

У меня есть переменная int в программе, которую я использую, чтобы определить, какой длины должны быть мои массивы в некоторых из моих структур,Я использовал его в своем заголовке как const int.Теперь я хочу, чтобы моя программа работала с переменными значениями в зависимости от заданных аргументов, но оставляю их только для чтения после того, как я назначу их во время выполнения.

Несколько идей, которые мне приходилось делатьсделай это.Есть ли предпочтительный способ?

  1. Объявить const int * в моем заголовке и присвоить его const int в моей основной функции, но это кажется неуклюжим.
  2. Сделать этообычный int в моей главной функции.
  3. Передача переменной в качестве аргумента при вызове функции.
  4. Что-то еще, о чем я еще не думал.

Ответы [ 4 ]

9 голосов
/ 24 октября 2011

Я бы использовал функционально-статическую переменную и простую функцию.Обратите внимание:

int GetConstValue(int initialValue = 0)
{
  static int theValue = initialValue;
  return theValue;
}

Поскольку это статическая переменная уровня функций, она инициализируется только в первый раз.Поэтому параметр initialValue бесполезен после первого запуска функции.Поэтому все, что вам нужно сделать, - это убедиться, что первый вызов функции - это тот, который ее инициализирует.

6 голосов
/ 24 октября 2011

C ++ не имеет встроенного решения для этого, но если вы действительно хотите убедиться, что ваш int назначается только один раз, вы можете создать свой собственный специальный класс int:

class MyConstInt
{
public: 
    MyConstInt(): assigned(false) {}
    MyConstInt& operator=(int v)
    {
        assert(!assigned); 
        value = v; 
        assigned = true; 
        return *this; 
    }   
    operator int() const 
    { 
        assert(assigned); 
        return value; 
    }
private: 
    int value; 
    bool assigned; 
}; 


MyConstInt mi; 
//  int i = mi;         //  assertion failure; mi has no value yet
mi = 42; 
//  mi = 43;        //  assertion failure; mi already has a value
int* array = new int[mi]; 
1 голос
/ 24 октября 2011

Когда вы точно знаете правильное значение?Если вы читаете это из файла или чего-то еще, вы можете просто сказать:

const int n = determine_correct_value();
0 голосов
/ 24 октября 2011

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

С другой стороны, если у вас есть значения констант области действия, вы просто объявите и инициализируете их одновременно, следуя общему руководству C ++.объявить как можно ближе к использованию сайта.Например, отметьте использование констант в следующей локальной области:

for (auto it = v.begin(), end = v.end(); it != end; ++it)
{
  const Foo & x = *it;
  const std::size_t n = x.get_number_of_bars();

  // use x and n ...

  const bool res = gobble(x, zip(n));
  if (res && shmargle(x)) { return 8; }
}

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

...