2013-02-16 32 views
11

Hai dòng sau có thể được cô đặc thành một không?Biến có thể được khởi tạo với một dòng istream trên cùng một dòng được khai báo không?

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

Có thể 'int cũ; std :: cin >> cũ; '? –

+0

Không, vẫn là một bản sao. http://stackoverflow.com/questions/12279601/are-there-any-tricks-to-use-stdcin-to-initialize-a-const-variable – djechlin

+0

Tôi đã đặt tên lại câu hỏi cũ và đáng xấu hổ này vì nó đã nhận được một rất nhiều sự chú ý gần đây. –

Trả lời

16

Câu trả lời thông minh-mông:

int old; std::cin >> old; 

Câu trả lời khủng khiếp:

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

Câu trả lời đúng: old phải được định nghĩa với một tuyên bố trước khi nó có thể được thông qua đến operator>> làm đối số. Cách duy nhất để nhận cuộc gọi hàm trong khai báo biến là đặt nó trong biểu thức khởi tạo như trên. Cách chấp nhận để khai báo một biến và đọc đầu vào nó là như bạn đã viết:

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

Đẹp và thích hợp. +1. –

+0

Tại sao một biến khác? – 6502

+1

câu trả lời thông minh-ass, lol. cảm ơn, đó là thông tin –

9

Bạn có thể ... với

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

nhưng bạn thực sự không nên làm điều này

+1

Ah, điểm tốt! Tài giỏi. –

+1

@ 6502 lý do tại sao chúng ta không nên làm những gì bạn nói? – Mohammasd

2

Sử dụng một chức năng:

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

Sau đó:

int a=inputdata(); 

Đối với dữ liệu riêng của mình:

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

Nhưng bây giờ làm điều đó để 'dữ liệu' quá! –

+0

@JosephMansfield Tôi nghĩ, trong câu hỏi ban đầu, đôi khi bạn chỉ muốn khởi tạo biến cho giá trị người dùng-đầu vào thay vì mặc định hệ thống, giá trị không xác định hoặc giá trị của riêng bạn mà bạn từ chối xác định. Vì mục đích của 'dữ liệu', tôi cảm thấy không cần phải" làm như vậy "với nó, vì nó sẽ chỉ tồn tại trong phạm vi địa phương của hàm cho tất cả ba dòng thời gian thực hiện, và có lẽ nếu hàm được đánh dấu như nội tuyến nó thậm chí có thể được tối ưu hóa hoàn toàn đi. 'int old = inputdata();' có thể kết thúc tương đương với 'int old; std :: cin >> cũ, 'nếu điều đó xảy ra. – thegreatjedi

1

Có lẽ không cho int, nhưng với nhiều loại riêng bạn:

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

Sau đó, bạn có thể tạo kiểu với istream truyền cho constructor:

int main() { 
    istringstream iss("42"); 
    MyType object(iss); 
} 
Các vấn đề liên quan