2009-12-07 32 views
7

Tôi đang làm việc trên một dự án cho trường học và người hướng dẫn khăng khăng rằng tất cả các mã đều đi vào một tệp .cpp (để phân loại dễ dàng hơn về phía mình). Tôi muốn xác định nhiều lớp trong tệp này. Tôi có gặp phải bất kỳ vấn đề nào trong việc thực hiện điều này không?Có thể định nghĩa nhiều lớp chỉ trong một tệp .cpp không?

+2

Bạn có thể đặt các lớp của mình vào bất kỳ tiêu đề nào bạn muốn, sau đó chạy gcc -E và gửi hướng dẫn cho đầu ra. Không thực sự làm điều đó, bởi vì (a) người hướng dẫn của bạn sẽ từ chối đọc nó, và (b) tất cả các chèn từ tiêu đề chuẩn sẽ kích hoạt cảnh báo đạo văn. Nhưng nếu bạn nhìn vào đầu ra đó một lần, và lưu ý rằng nó có thể biên dịch được, bạn sẽ thấy rằng bạn có thể làm bất cứ điều gì bạn thích trong một tệp cpp mà bạn có thể làm trong các tiêu đề. –

+1

Nếu người hướng dẫn của bạn đã yêu cầu bạn gửi một tệp, thì không phải là hợp lý để giả định rằng ngôn ngữ lập trình của bạn có cho phép một thứ như vậy không? Lý do gì bạn phải nghi ngờ người hướng dẫn của bạn về vấn đề này? –

+0

@Rob: tốt điểm cho rằng chúng ta biết câu trả lời, nhưng xem xét rằng các giảng viên thường xuyên áp đặt các điều kiện như: "mà không sử dụng các cuộc gọi đệ quy, chỉ vòng"; "chỉ sử dụng các cuộc gọi đệ quy, không có vòng lặp"; và nói chung "treo ngược với một tay bị trói sau lưng". Không nghi ngờ gì về lý do giảng dạy âm thanh, nhưng nó có nghĩa là giả định của bạn không phải lúc nào cũng chính xác hoặc hợp lý ;-) –

Trả lời

25

Không có quy tắc nào bạn phải tuân thủ (như trong java). Bạn được tự do đặt và đặt tên các lớp trong các tệp có tên tuy nhiên bạn thích (bên cạnh hậu tố).

Tuy nhiên một câu hỏi khác của nó nếu đó là thực hành tốt (không phải của nó!).

+1

Để thêm vào điều này, đừng quên rằng bạn phải đặt các lớp bạn sẽ sử dụng trước lớp chính của bạn hoặc trình biên dịch sẽ không tìm thấy chúng. (trừ khi bạn sử dụng tờ khai chuyển tiếp) – DaMacc

6

Không có vấn đề gì khi viết nhiều lớp vào một tệp. Nó chỉ là vấn đề của phong cách bảo trì.

3

Chỉ các vấn đề về khả năng mở rộng/bảo trì;) Không có quy tắc nghiêm ngặt về vấn đề này.

+6

Nếu dự án trường này gặp phải vấn đề về khả năng mở rộng, Chad cần hủy bỏ lương cho công việc của mình ;-) –

9

Có, bạn có thể. Điều này có thể dễ dàng xác minh.

class C 
{ 
}; 

class D 
{ 
}; 

int main(int argc, char**argv) 
{ 
    return 0; 
} 
+6

mặc dù tuyên bố từ chối C++ thông thường được áp dụng, "chỉ vì trình biên dịch của bạn chấp nhận nó không có nghĩa là cho phép theo tiêu chuẩn C++ "(mặc dù trong trường hợp này, tất nhiên nó là hoàn toàn hợp lệ) – jalf

+0

Vâng, điểm tốt. –

3

No. Bạn sẽ không gặp rắc rối. Trong C++, bạn có thể định nghĩa nhiều lớp bên trong một tệp.

5

Bạn hoàn toàn có thể có nhiều lớp được khai báo và xác định trong cùng một tệp.

Bạn phải cẩn thận, tuy nhiên, khi một lớp phụ thuộc vào người khác đến sau. Nếu một lớp A là một thành viên của lớp B khác, trình biên dịch cần khai báo hoàn chỉnh của nó (để nó biết kích thước của nó), và bạn cần phải đặt nó lên cao hơn trong tệp. Tuy nhiên, nếu thành viên này chỉ là một con trỏ (có kích thước độc lập với kích thước của lớp được trỏ tới), thì một khai báo đơn giản về lớp được trỏ đến là đủ.

Lưu ý rằng với cơ chế #include, điều đó xảy ra khá nhiều: bộ xử lý trước sẽ "sao chép-dán" tất cả các tệp được bao gồm vào tệp đang được biên dịch. Để trình biên dịch, nó chỉ giống nhau.

3

Bạn sẽ không gặp bất kỳ sự cố khi xác định nhiều lớp trong một tệp.

Nó không phải là thói quen đặc biệt tốt cho hệ thống sản xuất, nhưng điều đó không phải là một vấn đề đối với bài tập về nhà

3

Có bạn có thể. Điều này phải được hỗ trợ bởi vì nếu không bạn sẽ không thể tạo các lớp lồng nhau.

class outside 
{ 
public: 
     class nested 
     { 
     public: 
      static int x; 
      static int y; 
      int f(); 
      int g(); 
     }; 
}; 
4

Thông thường, bạn chỉ nên đặt nhiều lớp trong một tập tin duy nhất nếu ...

  1. Các lớp được liên kết rất chặt chẽ. Ví dụ: nếu một lớp xác định trình vòng lặp của riêng nó thì có thể thích hợp để đặt lớp lặp đó trong cùng một tệp với lớp mà nó được sử dụng để lặp lại.

  2. Một trong các lớp là dành cho tiêu dùng công khai và các lớp còn lại được sử dụng để triển khai. Ví dụ: điều này sẽ áp dụng nếu bạn sử dụng thành ngữ "pimpl", trong đó thành viên duy nhất mà lớp công khai chứa là một con trỏ đến lớp riêng tư. Trong trường hợp này, có thể thích hợp để đặt các lớp riêng/ẩn trong tệp nguồn tương ứng với lớp công khai sử dụng chúng.

Trong cả hai trường hợp, quyết định đặt "trợ giúp công khai" (ví dụ: trình vòng lặp) và "trợ giúp riêng" (ví dụ:pimpl) các lớp trong cùng một tệp nguồn hoặc một tệp nguồn khác nhau phải được thực hiện một lần cho toàn bộ dự án và theo một cách nhất quán.

+0

Tôi thích câu trả lời của bạn khi bạn giải thích một số cách sử dụng, nơi đó là điều đúng đắn để làm. Ví dụ về trình lặp I chắc chắn đồng ý với. Lý do tôi nhìn này là vì tôi đang tạo một cửa sổ hộp thoại Qt theo thẻ cho các tùy chọn ứng dụng của tôi và tôi cần một lớp cho cửa sổ và các lớp cho các tab. Tôi đang tranh luận về việc chia nhỏ các tab thành các tệp nhưng tôi không thực sự có một vị trí trong cấu trúc tệp của mình cho điều đó. – Lightbulb1

2

Câu hỏi này đến từ biểu diễn nguồn phong cách java/C#. Trong C++ bố trí mã nguồn là rất khác nhau. Một đơn vị nguồn/"tệp cpp"/có thể xử lý nhiều khai báo như bạn muốn đưa vào. Tuy nhiên nó không phải là cần thiết một chiến lược tốt vì tại một số điểm bạn cần phải nói với các lớp khác làm thế nào để đối phó với các lớp học của bạn. Trong C++, một lớp có thể có một phần định nghĩa và khai báo riêng biệt và bạn có thể đặt chúng vào các tệp khác nhau. Định nghĩa của lớp được chia sẻ giữa các tệp nguồn khác với #include statements để bạn có thể sử dụng các lớp đó trong bất kỳ trường hợp nào cần định nghĩa. Nếu bạn đang đối phó với các lớp chỉ được sử dụng trong một tệp nguồn, bạn có thể ẩn nó ngay trong tệp nguồn, nhưng nếu bạn muốn kết nối chúng với các lớp khác, bạn cần đặt định nghĩa vào tệp tiêu đề.

Nó có thể giúp bạn cải thiện tốc độ biên dịch - đặc biệt nếu bạn đang sử dụng tiêu đề được biên dịch trước, nhưng caresully, vì pch-s không phải là một phần của tiêu chuẩn C++ và mọi trình biên dịch xử lý chúng theo một cách khác! - và sự linh hoạt của mã của bạn. Giáo viên của bạn nên biết những sự kiện này ...

2

Có, bạn có thể làm điều đó mà không có vấn đề gì. hoặc nhiều lớp hoặc lớp lồng nhau.

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