2013-02-16 14 views
11

Le due righe seguenti possono essere condensate in una?Una variabile può essere inizializzata con un istream sulla stessa riga dichiarata?

int foo; 
std::cin >> foo; 
+0

Forse 'int vecchio; std :: cin >> vecchio; '? –

+0

No, ancora un duplicato. http://stackoverflow.com/questions/12279601/are-there-any-tricks-to-use-stdcin-to-initialize-a-const-variable – djechlin

+0

Ho rinominato questa domanda vecchia e imbarazzante dal momento che sta ottenendo un molta attenzione di recente. –

risposta

16

La risposta smart-ass:

int old; std::cin >> old; 

La risposta orribile:

int old, dummy = (std::cin >> old, 0); 

La risposta corretta: old deve essere definito con un dichiarazione prima che possa essere passato a operator>> come argomento. L'unico modo per ottenere una chiamata di funzione all'interno della dichiarazione di una variabile è posizionarlo nell'espressione di inizializzazione come sopra. Il modo accettato di dichiarare una variabile e leggere di ingresso in esso è come hai scritto:

int old; 
std::cin >> old; 
+0

Bello e corretto. +1. –

+0

Perché un'altra variabile? – 6502

+1

risposta astuta, lol. grazie, questo è informativo –

9

Si può ... con

int old = (std::cin >> old, old); 

ma davvero non dovrebbe fare questo

+1

Ah, buon punto! Intelligente. –

+1

@ 6502 perché non dovremmo fare quello che dici ?? – Mohammasd

2

Utilizzando una funzione:

int inputdata() 
{ 
    int data; 
    std::cin >> data; 
    return data; 
} 

Poi:

int a=inputdata(); 

Per i dati si:

int inputdata() 
{ 
    static bool isDataDeclared=false; 
    if (isDataDeclared==true) 
    { 
    goto read_data; 
    } 
    else 
    { 
     isDataDeclared=true; 
    } 
    static int data=inputdata(); 
    return data; 
    read_data: 
    std::cin >> data; 
    return data; 
} 
+1

Ma ora fallo anche su 'data'! –

+0

@JosephMansfield Penso che, nella domanda iniziale, a volte si voglia solo inizializzare una variabile su un valore di input dell'utente rispetto a un default di sistema, un valore non definito o il proprio valore che si rifiuta di definire. Tuttavia, ai fini di 'data', ritengo che non sia necessario" fare lo stesso ", poiché esso esisterà solo nello scope locale della funzione per tutte e tre le righe di tempo di esecuzione, e forse se la funzione è marcata come in linea potrebbe addirittura essere ottimizzato del tutto. 'int old = inputdata();' può finire come equivalente a 'int old; std :: cin >> vecchio; 'se ciò accade. – thegreatjedi

1

Forse non per int, ma per i propri tipi:

class MyType { 
    int value; 
public: 
    MyType(istream& is) { 
     is >> *this; 
    } 

    friend istream& operator>>(istream& is, MyType& object); 
}; 

istream& operator>>(istream& is, MyType& object) { 
    return is >> object.value; 
} 

quindi è possibile creare il tipo con la istream passato al costruttore:

int main() { 
    istringstream iss("42"); 
    MyType object(iss); 
} 
Problemi correlati