2013-01-03 3 views
6

Ho un valore costante che non cambia mai durante l'esecuzione, ma è impossibile sapere fino al momento dell'esecuzione.C++ Assegnare un valore const in fase di esecuzione?

C'è un modo per dichiarare una costante (o come membro di una classe o meno) senza definirla e anche assegnare un valore calcolato una volta (e solo una volta) viene determinato; o dovrò ricorrere a una dichiarazione non const e usare la codifica S & Ps (ALL_CAPS nomi di variabili, static dichiarazione se in una classe, ecc.) a provare e impedirgli di cambiare?

PRECISAZIONE:

se queste sono buone risposte, la situazione del mondo reale che ho è più complicato:

Il programma ha un ciclo principale che corre continuamente tra il trattamento e il rendering; l'utente può impostare le opzioni richieste e una volta impostate non cambieranno mai fino al riavvio del programma. Una funzione "Inizializza" è impostata per tutto ciò che può essere determinato prima del ciclo principale, ma i valori che dipendono dall'interazione dell'utente devono essere eseguiti nel mezzo del ciclo durante la fase di elaborazione. (Al momento, vengono in mente tecniche di archiviazione dei dati persistenti ...)

+1

Per quanto riguarda il chiarimento. Sembra che tu abbia un ciclo e desideri che alcune variabili "diventino" const a un certo punto nel tempo. Questo non è fattibile; una variabile è const o non lo è. –

risposta

7

Qualcosa di simile?

const int x = calcConstant(); 

Se si tratta di un membro della classe, quindi utilizzare la lista di inizializzazione del costruttore, come nella risposta di Yuushi.

6

È possibile definire in un struct o class e utilizzare un elenco di inizializzazione:

#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

come una variabile statica o una funzione locale:

const int x = calcConstant(); 

Come un membro della classe:

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

Sì, è possibile creare un campo Singleton statico privato con un initiali metodo di zazione e un metodo gettor. Ecco un esempio di come farlo:

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

Il modo in cui ho risposto a questa domanda è stato quello di contare il numero di ciascun carattere della stringa, e restituire false dopo il numero di qualche personaggio supera il limite di caratteri, che avrebbe be (str.size() + 1)/2. Se nessun numero di caratteri supera questo limite, restituisce 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

Penso che tu abbia risposto a una domanda a cui non pensavi di rispondere. Sindrome della finestra sbagliata, forse? – Casey