2013-02-16 5 views
11

Können die folgenden zwei Zeilen zu einer zusammengefasst werden?Kann eine Variable mit einem istream in derselben Zeile initialisiert werden, in der sie deklariert ist?

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

Vielleicht 'int alt; std :: cin >> alt; '? –

+0

Nein, immer noch ein Duplikat. http://stackoverflow.com/questions/12279601/are-there-any-tricks-to-use-stdcin-to-initialize-a-const-variable – djechlin

+0

Ich habe diese alte und peinliche Frage neu betitelt, seit es eine bekommen hat viel Aufmerksamkeit in letzter Zeit. –

Antwort

16

Die smart-ass Antwort:

int old; std::cin >> old; 

Die schreckliche Antwort:

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

Die richtige Antwort: old muss mit einer Erklärung definiert werden, bevor sie übergeben werden können zu operator>> als ein Argument. Die einzige Möglichkeit, einen Funktionsaufruf innerhalb der Deklaration einer Variablen zu erhalten, besteht darin, sie wie oben in den Initialisierungsausdruck einzufügen. Die akzeptierte Art und Weise eine Variable und lesen Eingang zu erklären, in sie, wie Sie geschrieben haben:

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

Schön und ordentlich. +1. –

+0

Warum eine andere Variable? – 6502

+1

smart-ass antwort, lol. danke, das ist informativ –

9

Sie können ... mit

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

aber Sie sollten wirklich nicht tun

+1

Ah, guter Punkt! Klug. –

+1

@ 6502 warum sollten wir nicht tun, was du sagst ?? – Mohammasd

2

Verwendung eine Funktion:

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

Dann:

int a=inputdata(); 

Für Daten selbst:

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

Aber jetzt tun Sie es zu 'Daten' auch! –

+0

@JosephMansfield Ich denke, in der ursprünglichen Frage, manchmal möchten Sie nur eine Variable auf einen Benutzereingabewert im Gegensatz zu einem Systemstandard, einem undefinierten Wert oder Ihrem eigenen Wert, den Sie nicht definieren möchten, zu initialisieren. Für die Zwecke von "Daten" denke ich, dass es nicht notwendig ist, dasselbe zu tun, da es nur im lokalen Gültigkeitsbereich der Funktion für alle drei Zeilen der Ausführungszeit existiert, und vielleicht, wenn die Funktion markiert ist als Inline kann es sogar ganz weg optimiert werden. 'int old = Eingabedaten();' kann als äquivalent zu 'int alt; std :: cin >> alt; 'wenn das passiert. – thegreatjedi

1

Vielleicht nicht für int, sondern auch für Ihre eigenen Typen:

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; 
} 

Dann können Sie den Typ mit dem an den Konstruktor übergeben istream erstellen:

int main() { 
    istringstream iss("42"); 
    MyType object(iss); 
} 
Verwandte Themen