2013-02-16 32 views
11

Czy następujące dwie linie można skondensować w jedną?Czy zmienna może zostać zainicjowana za pomocą istream w tym samym wierszu, w którym została zadeklarowana?

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

Może 'int old; std :: cin >> old; '? –

+0

Nie, nadal duplikat. http://stackoverflow.com/questions/12279601/are-there-any-tricks-to-use-stdcin-to -initialize-a-start-variable – djechlin

+0

Powtórzyłem to stare i żenujące pytanie, odkąd dostał wiele uwagi ostatnio. –

Odpowiedz

16

Odpowiedź smart-ass:

int old; std::cin >> old; 

Straszne odpowiedź:

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

Prawidłowa odpowiedź: old musi być zdefiniowana z deklaracjązanim będzie mogła być przekazywana do operator>> jako argument. Jedynym sposobem uzyskania wywołania funkcji w deklaracji zmiennej jest umieszczenie jej w wyrażeniu inicjującym jak wyżej. Przyjęty sposób zadeklarować zmienną i czytać wkład w to jak masz napisane:

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

Ładne i właściwe. +1. –

+0

Dlaczego kolejna zmienna? – 6502

+1

smart-ass odpowiedź, lol. dziękuję, to jest pouczające –

9

Możesz ... z

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

ale naprawdę nie powinni robić tego

+1

Ah, dobry punkt! Sprytny. –

+1

@ 6502 dlaczego nie powinniśmy robić tego, co mówisz? – Mohammasd

2

Używanie funkcja:

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

Następnie:

int a=inputdata(); 

Dla danych sama:

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

Ale teraz zrób to również do "danych"! –

+0

@JosephMansfield Myślę, że w pierwotnym pytaniu, czasami po prostu chcesz zainicjować zmienną na wartość wejściową użytkownika, w przeciwieństwie do domyślnej wartości systemowej, niezdefiniowanej wartości lub własnej wartości, której nie chcesz zdefiniować. Dla celów 'danych' uważam jednak, że nie ma potrzeby" robić tego samego ", ponieważ będzie on istnieć tylko w zasięgu lokalnym funkcji dla wszystkich trzech linii czasu wykonania, i być może jeśli funkcja jest zaznaczona jako inline może nawet zostać całkowicie zoptymalizowany. 'int old = inputdata();' może skończyć jako odpowiednik 'int old; std :: cin >> old; 'jeśli tak się stanie. – thegreatjedi

1

Może nie dla int, ale dla własnych typów:

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

Następnie można utworzyć typ z istream przekazany do konstruktora:

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