2010-04-24 32 views
24

Tôi đang cố gắng tăng tốc độ thường trình bằng cách viết nó bằng C++, sau đó sử dụng nó bằng cách sử dụng ctypes hoặc cython.Có thể một lớp C++ bao gồm chính nó như là một thành viên?

Tôi là người mới sử dụng C++. Tôi đang sử dụng Microsoft Visual C++ Express vì nó hoàn toàn miễn phí.

Tôi dự định triển khai cây biểu thức và phương pháp để đánh giá nó theo thứ tự postfix.

Vấn đề tôi gặp phải ngay lập tức là:

class Node { 
    char *cargo; 
    Node left; 
    Node right; 
}; 

Tôi không thể tuyên bố left hoặc right như Node loại.

Trả lời

63

Không, vì đối tượng sẽ vô cùng lớn (vì mỗi Node có thành viên hai đối tượng khác Node, mỗi đối tượng có hai thành viên khác nhau là Node).

Bạn có thể, tuy nhiên, có một con trỏ đến kiểu lớp như là một biến thành viên:

class Node { 
    char *cargo; 
    Node* left; // I'm not a Node; I'm just a pointer to a Node 
    Node* right; // Same here 
}; 
8

Không, nhưng nó có thể có một tham chiếu hoặc một con trỏ đến bản thân:

class Node 
{ 
    Node *pnode; 
    Node &rnode; 
}; 
+1

Tài liệu tham khảo không thực sự hoạt động trong trường hợp này vì chúng không được phép rỗng và bạn cần kết thúc null hoặc biểu đồ sẽ là vô hạn. – Blindy

+3

Bạn có thể tạo một nút giả để có tốc độ NULL. Tuy nhiên, điều này không hoạt động tốt vì các tham chiếu không thể được gán lại cho một thứ khác, và sửa đổi thành bất kỳ liên kết nào sẽ yêu cầu xây dựng lại tất cả các nút đến gốc. – Potatoswatter

+0

@Blindy: Bạn cũng có thể đặt tham chiếu nút thành '* this' thay cho NULL. – MSalters

21

Just để hoàn thành, lưu ý rằng một lớp có thể chứa một bản sao tĩnh của chính nó:

class A 
{ 
    static A a; 
}; 

Điều này là do tĩnh các thành viên không thực sự được lưu trữ trong các cá thể lớp, do đó không có đệ quy.

+0

Điều này đã đảo ngược đầu của tôi một chút, vì vậy tôi sẽ thêm một cái gì đó: trong trường hợp này, mỗi cá thể của lớp 'A' sẽ chỉ lưu một con trỏ tới một khoảng trống được cấp phát trong bộ nhớ tĩnh cho cá thể 'a' cụ thể. Vì vậy, cá thể 'a' cũng có một con trỏ, trỏ đến chính nó vô hạn: 'A * someA = new A;' 'someA ->. Aaa..etc.' (giả sử 'a' là thuộc tính công khai) và đó là lý do tại sao bộ nhớ được sử dụng trong hữu hạn. – hymced

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