C++ có một thứ gọi là Quy tắc một định nghĩa. Nó có nghĩa là (không bao gồm các hàm nội tuyến), các định nghĩa chỉ có thể xuất hiện trong một đơn vị biên dịch. Vì các tệp tiêu đề C++ chỉ là "sao chép và dán" ở mọi tệp bao gồm, bây giờ bạn đang đặt định nghĩa ở nhiều nơi nếu bạn chỉ cần đặt các định nghĩa trong các tệp tiêu đề.
Tất nhiên, bạn có thể nói, tại sao không làm mọi thứ nội tuyến. Vâng, nếu trình biên dịch tôn trọng đề xuất nội tuyến của bạn, mã cho các chức năng dài sẽ được sao chép tại mọi trang web cuộc gọi, làm cho mã của bạn quá lớn và có thể gây ra sự cố, vấn đề bộ nhớ cache và tất cả các loại công cụ không thích hợp. Mặt khác, nếu trình biên dịch không nghe bạn, và không inline bất cứ điều gì, bây giờ bạn có 2 vấn đề: 1) bạn không biết đơn vị dịch nào có định nghĩa lớp học của bạn, và 2) trình biên dịch vẫn phải lội qua các định nghĩa của bạn mỗi khi bạn # bao gồm chúng. Hơn nữa, không có cách nào dễ dàng để đảm bảo bạn đã không vô tình xác định cùng một phương thức hai lần, trong 2 tiêu đề khác nhau, khác nhau.
Bạn cũng nhận được sự cố phụ thuộc vòng tròn. Đối với một lớp để gọi phương thức của lớp khác, lớp đó cần phải được khai báo trước. Vì vậy, nếu 2 lớp cần gọi các phương thức của nhau, mỗi lớp phải được khai báo trước khi có thể được định nghĩa. Không có cách nào để làm điều này với các khai báo và định nghĩa trong một tập tin.
Thực sự, đó là cách ngôn ngữ và trình phân tích cú pháp được tạo. Đó là một nỗi đau, nhưng bạn chỉ phải đối phó với nó.
Tôi có nghĩa là đặt định nghĩa toàn bộ lớp vào a. H và bao gồm nó, trong khi bảo vệ nó với tiêu đề bảo vệ –
điều gì xảy ra nếu bạn bao gồm tệp .h ở nhiều nơi trong cùng một tệp thực thi? Trả lời: bạn kết thúc với nhiều định nghĩa của cùng một hàm. - Điểm thực sự ở đây là bạn có thể làm tất cả những thứ ngốc nghếch với các quy tắc, nhưng chúng hầu như luôn luôn không hoạt động tốt trong thực tế như những cách bình thường. –