2013-05-31 24 views
7

Tôi gặp vấn đề với Tuyên bố Chuyển tiếp trong C++ bằng trình biên dịch clang. Đây là mã của tôi. Nó chỉ dữ liệu trong thành viên CReference là loại không đầy đủ. Xin vui lòng giúpChuyển tiếp Tuyên bố của lớp trong C++, loại không đầy đủ

class Internal; 

class CReference { 
private: 
    Internal data; 
public: 

    CReference() {}  
    ~CReference(){} 
}; 

class Internal { 
public: 
    Internal() {} 
    ~Internal() {} 
}; 
+0

Bạn chỉ đơn giản là không thể sử dụng một tuyên bố chuyển tiếp ở đây. 'CReference' cần khai báo đầy đủ' Internal'. – juanchopanza

+0

Bạn nên sử dụng con trỏ tới 'Internal' nếu bạn muốn chuyển tiếp khai báo nó. – user1520427

+1

có thể trùng lặp của [Khi nào sử dụng khai báo chuyển tiếp?] (Http://stackoverflow.com/questions/553682/when-to-use-forward-declaration) – juanchopanza

Trả lời

3

Chuyển tiếp tuyên bố chỉ cho phép bạn sử dụng con trỏ và tham chiếu đến nó, cho đến khi kê khai đầy đủ có sẵn

15

Chuyển tiếp tuyên bố là hữu ích, khi trình biên dịch không cần định nghĩa hoàn chỉnh các loại. Nói cách khác, nếu bạn thay đổi Internal data; thành Internal* data hoặc Internal& data, nó sẽ hoạt động.

Sử dụng Internal data;, trình biên dịch cần biết toàn bộ định nghĩa của Intrenal, để có thể tạo cấu trúc lớp CReference.

+0

Hầu như một câu trả lời hoàn hảo. Tất cả những gì còn lại là đề cập đến việc anh ta có thể di chuyển định nghĩa của CReference ở trên và nó sẽ hoạt động. –

+0

@RickYorgason - tất nhiên, nhưng tôi đoán OP biết rằng, có vẻ hiển nhiên, vì 'lớp Internal' không cần phải" biết "về' lớp CReference'. –

1

Để sử dụng kiểu làm thành viên của một lớp, trình biên dịch phải biết mức độ lớn của nó, sao cho kích thước của lớp có thể được tính toán chính xác. Một tờ khai chuyển tiếp không cung cấp thông tin đó (C++ sẽ không nhìn về phía trước và cố gắng tìm nó, đặc biệt vì cơ thể có thể được khai báo trong một đơn vị dịch khác), vì vậy bạn không thể sử dụng nó như một thành viên giá trị.

Bạn có thể sử dụng con trỏ hoặc tham chiếu thay vì vì con trỏ và tham chiếu có cùng kích thước bất kể chúng thuộc loại nào. Sau đó, trình biên dịch chỉ cần biết kích thước của loại đó khi bạn bắt đầu thao tác nó, và vì vậy bạn có thể lấy đi mà không cần khai báo đầy đủ cho đến lúc đó.

0

Như đã đề cập ở trên. Tuyên bố chuyển tiếp có sử dụng nó để tránh địa chỉ tiêu đề trong tệp tiêu đề khi chỉ sử dụng một con trỏ đơn giản của một lớp trong tiêu đề.

Bạn thường muốn bao gồm các tệp tiêu đề càng ít càng tốt. Điều này có thể đạt được bằng cách chuyển tiếp lớp, nhưng chỉ khi nó không phải là một lớp lồng nhau và chỉ khi con trỏ được sử dụng trong tiêu đề, vì kích thước con trỏ này là thông tin bắt buộc, được cung cấp bởi dấu gạch chéo chuyển tiếp.

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