2011-12-15 31 views
25
class base { 
public: 
    base a; 
}; 

Nó cung cấp lỗi biên dịch.Tại sao một lớp được phép có một thành viên tĩnh của chính nó, nhưng không phải là một thành viên không tĩnh?

class base { 
public: 
    static base a; 
}; 

trong khi mã này không đưa ra lỗi biên dịch

+8

cấu trúc {static a b; } a :: b; –

+2

@ JohannesSchaub-litb Bạn chỉ cần cho tôi một nhức đầu o_O –

+6

Yo chó, tôi nghe bạn thích các lớp học ... – Matthew

Trả lời

41

static thành viên lớp không được lưu trữ trong trường hợp lớp, đó là lý do tại sao một static sẽ làm việc.

Lưu trữ một đối tượng bên trong một đối tượng khác cùng loại sẽ phá vỡ thời gian chạy - kích thước vô hạn, phải không?

Điều gì sẽ sizeof trở lại? Kích thước của đối tượng cần được trình biên dịch biết, nhưng vì nó chứa một đối tượng cùng loại, nó không có ý nghĩa.

6

Tôi đoán lỗi là cái gì đó như

lĩnh vực 'a' có loại không đầy đủ

Điều này là do khi không tĩnh, lớp A không được định nghĩa đầy đủ cho đến khi kết thúc cú đúp . Các biến thành viên tĩnh, mặt khác, cần một bước định nghĩa riêng biệt sau khi lớp được định nghĩa đầy đủ, đó là lý do tại sao chúng hoạt động.

Tìm kiếm sự khác biệt giữa khai báo định nghĩa để được giải thích kỹ lưỡng hơn.

+0

Không thể trình biên dịch sắp xếp "đặt lời nhắc" cho chính nó để "thêm" mà sau này? Giới hạn là gì? –

+2

@AssafLevy Kích thước của vật thể là bao nhiêu. 'Base' chứa một' Base', chứa một 'Base' ... –

+3

@JamesKanze: Sắp xếp hai gương đối diện với nhau .. OK, cảm ơn! –

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