2013-01-03 5 views
6

У меня есть постоянное значение, которое никогда не изменяется во время выполнения, но невозможно знать до времени выполнения.C++ Назначить значение const во время выполнения?

Есть ли способ объявить константу (либо как член класса, либо нет), не определяя ее, а также присвоить вычисленное значение один раз (и только один раз), он определяется; или мне придётся прибегнуть к неконстантной декларации и использовать кодирование S & Ps (ALL_CAPS имена переменных, static декларация, если в классе и т. д.) до попробуйте и не менять его?

ПОЯСНЕНИЕ:

Хотя это хорошие ответы, ситуация в реальном мире у меня есть более сложное:

Программа имеет основной цикл, который постоянно проходит между обработкой и рендерингом; пользователь может установить требуемые параметры, и как только они будут установлены, они никогда не изменятся, пока программа не перезапустится. Функция «Инициализация» настраивается для всего, что может быть определено до основного цикла, но значения, зависящие от взаимодействия с пользователем, должны выполняться в середине цикла на этапе обработки. (На данный момент приходят на ум устойчивые методы хранения данных ...)

+1

Относительно уточнения. Похоже, что у вас есть цикл, и вы хотите, чтобы какая-то переменная (ы) «становилась» const в какой-то момент времени. Это невозможно; переменная является либо const, либо нет. –

ответ

7

Что-то вроде этого?

const int x = calcConstant(); 

Если это член класса, а затем использовать список инициализации конструктора, как в ответ Yuushi в.

6

Вы можете определить его в struct или class и использовать список инициализации:

#include <iostream> 

struct has_const_member 
{ 
    const int x; 

    has_const_member(int x_) 
     : x(x_) 
    { } 

}; 

int main() 
{ 
    int foo = 0; 
    std::cin >> foo; 
    has_const_member h(foo); 
    std::cout << h.x << "\n"; 
    return 0; 
} 
4

В статической или функции локальной переменной:

const int x = calcConstant(); 

В качестве члена класса:

struct ConstContainer { 
    ConstContainer(int x) : x(x) {} 
    const int x; 
}; 
1

Да, вы можете создать личное статическое одноэлементное поле с инициализацией zation и метод gettor. Вот пример того, как сделать это:

// In foo.h 
class Foo 
{ 
public: 
    // Caller must ensure that initializeGlobalValue 
    // was already called. 
    static int getGlobalValue() { 
     if (!initialized) { 
      ... handle the error ... 
     } 
     return global_value; 
    } 

    static void initializeGlobalValue(...) 

private: 
    static bool initialized; 
    static int global_value; 
}; 

// In foo.cpp 
bool Foo::initialized = false; 
int Foo::global_value; 

void Foo::initializeGlobalValue(...) { 
    if (initialized) { 
     ...handle the error... 
    } 
    global_value = ...; 
    initialized = true; 
} 
0

Я так ответил на этот вопрос должен был посчитать количество каждого символа в строке и возвращает ложь после того, как номер некоторого символа превышает ограничение на количество символов, которые бы be (str.size() + 1)/2. Если количество символов превышает этот предел, верните true.

bool canShuffle(string str) { 
    int maxCharCount = (str.size()+1)/2; 
    int charCount[256] = {0}; 

    for(char c : str) { 
     if(++charCount[c] >= maxCharCount) 
      return false; 
    } 
    return true; 
} 
+3

Я думаю, вы ответили на вопрос, который не считаете своим ответом. Возможно, неправильный синдром окна? – Casey

Смежные вопросы