2011-01-17 5 views
76

Tôi chưa bao giờ thấy nó trước đây. Tôi nghĩ đó là một lỗi đánh máy cho ":: mẫu", nhưng khi tôi nhìn thấy nó thực sự biên dịch tôi đã rất bối rối. Bất cứ ai có thể giúp tôi tìm ra xin vui lòng? Tôi không nghĩ đó là nhãn goto."class:" có nghĩa là gì trong C++?

void f() { 
    class: sample { 
    // there were some members declared here 
    } x; 
} 
+5

Trông giống như một lớp ẩn danh (được kế thừa từ mẫu) dụ x. Chưa bao giờ thấy điều này trước đây. Có lẽ đó là C++ 0x? – ssmir

+1

chỉ đoán: đây có phải là lớp chưa được đặt tên bắt nguồn từ 'mẫu' không? – davka

+13

Đó không phải là nhãn 'goto'? Đúng, 'goto' trên cùng của' lớp'! –

Trả lời

78

Đây là lớp chưa đặt tên và dấu hai chấm có nghĩa là nó được thừa hưởng riêng từ sample. Xem nó như

class Foo : private sample 
{ 
    // ... 
}; 

Foo x; 
+9

Ồ, thật thú vị. Có vẻ như bạn đã đúng, có một lớp "mẫu" trong phạm vi và các thành viên lớp truy cập vào lớp cơ sở. Bây giờ tôi thấy. –

+2

@Johannes: đây là một cách tiếp cận khá hạn chế, vì lớp chưa đặt tên không thể có các hàm tạo hoặc hàm hủy mặc định, cũng không thể được sử dụng làm mẫu (vì nó là một lớp địa phương). Tôi rất tò mò về việc sử dụng cấu trúc này là gì. Trường hợp sử dụng duy nhất mà tôi biết cho các lớp địa phương là "kiểu xoá thành ngữ" (nghĩa là trả về một 'mẫu *', nhưng 'mẫu' là một lớp cơ sở không thể tiếp cận ở đây). –

+0

@Alexandre nó đã không xảy ra trong mã thực. Đó là một trong những tệp sân chơi của tôi. –

21

Tôi nghĩ rằng đó là xác định một lớp vô danh bắt nguồn từ sample. Và x là biến của lớp chưa đặt tên đó.

struct sample{ int i;}; 

sample f() 
{ 
    struct : sample 
    { 
    // there were some members declared here 
    } x; 
    x.i = 10; 
    return x; 
} 
int main() 
{ 
     sample s = f(); 
     cout << s.i << endl; 
     return 0; 
} 

Mẫu mã tại ideone: http://www.ideone.com/6Mj8x

PS: Tôi đã thay đổi class-struct vì lý do khả năng tiếp cận!

1

Đó là một lớp chưa đặt tên.

Bạn có thể sử dụng chúng, ví dụ: để thay thế cho các chức năng địa phương trong pre-C++ 11:

int main() { 
    struct { 
     int operator() (int i) const {     
      return 42; 
     } 
    } nice; 

    nice(0xbeef); 
} 

Dấu hai chấm theo sau sample đơn giản có nghĩa xuất phát từ sample sử dụng thừa kế mặc định. (đối với cấu trúc: công khai, đối với lớp học: riêng tư)