2011-11-17 29 views
5

tôi có thể khai báo một con trỏ đến một lớp học mà vẫn chưa được xác định, như thế này:Tuyên bố lớp lồng nhau trước khi chúng được định nghĩa

class A ; 
A* p ; 

Nhưng làm thế nào để tôi làm điều này cho một lớp lồng nhau? Tôi muốn làm điều này:

class A ; 
class A::B ; // error: 'B' in class 'A' does not name a type 
A::B* p ; 

Nhưng nó không biên dịch (sử dụng g ++ 4.5.2). Có cách nào để thực hiện công việc này không?

+0

Chỉ cần không làm tổ B nếu bạn cần. (Bạn có thể nhóm các lớp với các không gian tên. Làm tổ - ít nhất là trong C++ 03 - không thêm giá trị nào khác.) – visitor

+0

Không thể cho đến khi lớp 'A' được xác định. Bạn phải thiết kế lại để không sử dụng các lớp lồng nhau cho đến sau khi định nghĩa của lớp có chứa lớp lồng nhau. –

+0

Xem thêm [Có cách nào ngắn hơn để chuyển tiếp khai báo một lớp trong không gian tên không?] (Http://stackoverflow.com/questions/1368642). – outis

Trả lời

4

Có một số phần của C++ 03 không cho phép chuyển tiếp các khai báo lớp lồng nhau. Đặc biệt, § 7.1.5.3 xây dựng loại specifiers:

  1. Nếu một xây dựng-type-specifier là thành phần duy nhất của một tuyên bố, tuyên bố là vô hình thành trừ khi nó là một chuyên môn hóa rõ ràng (14.7.3), một instantiation rõ ràng (14.7.2) hoặc nó có một trong các hình thức sau:

    class-keyidentifier ; 
    friend class-key ::optidentifier ; 
    friend class-key ::opttemplate-id ; 
    friend class-key ::optnested-name-specifieridentifier ; 
    friend class-key ::optnested-name-specifiertemplateopt 
    template-id ; 
    
  2. 3.4.4 mô tả cách tiến hành tra cứu tên cho định danh trong một được xây dựng theo kiểu-specifier. Nếu định giải quyết để một class-name hoặc enum tên, các xây dựng-type-specifier giới thiệu nó vào tờ khai theo cùng một cách một đơn giản-type-specifier giới thiệu của nó loại tên. [...] Nếu tra cứu tên không tìm thấy khai báo cho tên, công cụ chỉ định kiểu được xây dựng không đúng dạng trừ khi nó có dạng đơn giản khóa học số nhận dạng trong trường hợp này, mã số là tuyên bố như mô tả trong 3.3.1.

Nói tóm lại, khi một định danh được scoped, trình biên dịch phải cố gắng giải quyết các định danh. Khi phạm vi là một lớp, trình biên dịch phải tra cứu khai báo cho định danh trong lớp bên ngoài. Khi lớp bên ngoài chưa được xác định, điều này không thể được thực hiện và kết quả là một chương trình không đúng định dạng.

3

Hãy xem xét một vùng tên thay vì lớp lồng nhau.

class A; 
A * pa; 
namespace A_help 
{ 
    class B; 
} // namespace A_help 
A_help::B * pb; 
Các vấn đề liên quan