2013-01-03 38 views
6

Mam stałą wartość, która nigdy się nie zmienia w czasie wykonywania, ale jest niemożliwa do uzyskania do czasu wykonania.C++ Przypisywanie wartości stałej w czasie wykonywania?

Czy istnieje sposób zadeklarowania stałej (jako członka klasy lub nie) bez jej zdefiniowania, a także przypisania wartości obliczonej tylko raz (i tylko raz) jest ona określana; lub czy będę musiał odwołać się do deklaracji non const i użyć kodowania S & Ps (ALL_CAPS nazw zmiennych, static deklaracja, jeśli w klasie itp.) na spróbuj i nie zmieniaj?

Wyjaśnienie:

Choć są to dobre odpowiedzi, sytuacja w świecie rzeczywistym mam jest bardziej skomplikowana:

Program posiada główną pętlę, która nieustannie biegnie między przetwarzania i renderowania; użytkownik może ustawić wymagane opcje, a po ich ustawieniu nigdy się nie zmienią, dopóki program nie zostanie ponownie uruchomiony. Funkcja "Inicjalizuj" jest skonfigurowana dla wszystkiego, co można określić przed główną pętlą, ale wartości zależne od interakcji użytkownika muszą być wykonywane w połowie pętli podczas fazy przetwarzania. (W tej chwili przychodzą na myśl trwałe techniki przechowywania danych).

+1

Odnośnie do wyjaśnienia. Wygląda na to, że masz pętlę i chcesz, aby niektóre zmienne stały się "stałe" w pewnym momencie. To nie jest możliwe; zmienna jest albo stała, albo nie jest. –

Odpowiedz

7

Coś takiego?

const int x = calcConstant(); 

Jeśli jest członkiem klasy, użyj listy inicjalizacji konstruktora, tak jak w odpowiedzi Yuushi.

6

Można zdefiniować ją w struct lub class i wykorzystać listę inicjalizacji:

#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

jako statyczny lub funkcji lokalnego zmiennej:

const int x = calcConstant(); 

Jako członek klasy:

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

Tak, można utworzyć prywatne, statyczne pole singleton z początkowym zation metoda i metoda gettor. Oto przykład jak to zrobić:

// 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

Sposób odpowiedziałem na to pytanie było policzyć każdego znaku w łańcuchu, a return false po liczba charakterem przekracza limit znaków, które be (str.size() + 1)/2. Jeśli liczba znaków nie przekroczy tego limitu, zwróć 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

Myślę, że odpowiedziałeś na pytanie, na które nie sądziłeś, że odpowiadasz. Niewłaściwy syndrom okna? – Casey

Powiązane problemy