2012-03-13 33 views
5

Tôi có một lớp học như thế nàyđối tượng biến kích thước có thể không được khởi tạo

class aClass 
{ 
    public: 
    aClass() : N(5) {} 
    void aMemberFunction() 
    { 
     int nums[N] = {1,2,3,4,5}; 
    } 
    private: 
    const int N; 
}; 

Mã thử nghiệm là

int main() 
{ 
    aClass A; 
    A.aMemberFunction(); 

    const int N = 5; 
    int ints[N] = {5,4,3,2,1}; 
    return 0; 
} 

Khi tôi biên dịch (g ++ 4.6.2 20.111.027), tôi nhận được lỗi

problem.h: In member function ‘void aClass::aMemberFunction()’: 
problem.h:7:31: error: variable-sized object ‘nums’ may not be initialized 

Nếu tôi nhận xét dòng với int nums[N] Tôi không nhận được lỗi biên dịch, vì vậy mã tương tự cho ints mảng là tốt. Giá trị của N có được biết đến lúc biên dịch không?

Điều gì đang xảy ra? Tại sao nums được coi là một mảng có kích thước biến? Tại sao các mảng numsints được xử lý khác nhau?

+1

Trong mảng C++ yêu cầu biểu thức liên tục cho kích thước của chúng. nghĩa là nó phải là một hằng số biên dịch, nhưng N trong ví dụ của bạn được khởi tạo động mặc dù là một chữ. – AraK

+0

Lưu ý rằng 'gcc' thực sự hỗ trợ các mảng độ dài biến đổi trong C++ như một phần mở rộng bạn chỉ [không thể khởi tạo chúng như thế] (http://stackoverflow.com/a/27339171/1708801) –

Trả lời

9

Giá trị của N không biết tại thời gian biên dịch?

No. Tại thời điểm aMemberFunction được biên dịch, trình biên dịch không phải bây giờ là N, vì giá trị của nó được xác định trong thời gian chạy. Không đủ thông minh để thấy rằng chỉ có một hàm tạo và giả định rằng giá trị của N có thể khác với 5.

+0

Cảm ơn, điều đó có ý nghĩa. – stardt

+0

Trình biên dịch C++ có vẻ không đủ thông minh với tôi, nhiều ngôn ngữ chính khác có thể hỗ trợ khởi tạo một mảng theo cách ints [N]. –

3

N không được biết trong thời gian biên dịch trong ví dụ của bạn, nhưng trong thời gian này:

class aClass 
{ 
    private: 
    static const int N = 5; 
    public: 
    aClass() {} 
    void aMemberFunction() 
    { 
     int nums[N] = {1,2,3,4,5}; 
    } 
}; 

Mã trên sẽ biên dịch và sẽ khai báo mảng địa phương năm int s.

+0

Có cách nào để tạo một mảng biến không? Tôi cần nó để giữ X số int, tùy thuộc vào những gì người dùng nhập vào, tôi không có cách nào để biết những gì họ sẽ nhập để nó * có * được biến. – MarcusJ

Các vấn đề liên quan