2011-02-07 61 views
7

tiêu đề Tôi mới vào c/C++, tôi đang bối rối về sau:C++ bao gồm vấn đề

  1. Cho dù tôi nên đặt khai báo lớp trong tập tin tiêu đề của riêng mình, và thực tế triển khai trong tập tin khác?
  2. Tôi có nên đặt tiêu đề như <iostream> vào tệp example.h hoặc trong tệp example.cpp không?
  3. Nếu tất cả các lớp cần sử dụng <iostream> và tôi bao gồm tệp tiêu đề của lớp vào tiêu đề của lớp khác, điều đó có nghĩa là tôi đã bao gồm <iostream> hai lần?
  4. Nếu tôi sử dụng nhiều lớp STL, cách tốt nhất để sử dụng std:: là gì?
+1

# 4 là khác biệt đủ để xứng đáng với câu hỏi riêng của mình – Cameron

+0

Đây là những câu hỏi phong nha, nhưng kết hợp tất cả chúng thành một là "quá rộng". –

Trả lời

8

1.Whether tôi nên đặt khai báo lớp trong tập tin riêng của mình header, và thực hiện thực tế trong tập tin khác ?

Bạn có thể viết định nghĩa của một lớp và định nghĩa của các thành viên của lớp riêng biệt trong cùng một tệp tiêu đề nếu bạn đang thao tác mẫu. Ngoài ra, nếu bạn muốn làm cho các thành viên của bạn hoạt động nội tuyến, bạn có thể định nghĩa chúng trong chính định nghĩa lớp đó. Trong mọi trường hợp khác, tốt hơn là tách định nghĩa của lớp (tệp .hpp) và định nghĩa của các thành viên của lớp (.cpp).

2.Tôi muốn đặt tiêu đề như trong tệp example.h hoặc trong example.cpp tệp?

Tùy thuộc vào nếu bạn cần các tiêu đề đó trong tệp example.h hoặc chỉ trong tệp .cpp của bạn.

3. Nếu tất cả các lớp cần sử dụng, và tôi bao gồm tập tin tiêu đề của một lớp thành tiêu đề của lớp khác, có nghĩa là tôi bao gồm hai lần?

Nó sẽ xảy ra nếu bạn không quấn định nghĩa lớp của bạn bằng các macro sau:

#ifndef FOO_HPP 
#define FOO_HPP 
class { 
... 
}; 
#endif 

5.Nếu tôi sử dụng một lớp STL rất nhiều, một thực hành tốt để sử dụng std là gì: :?

Tôi nghĩ sẽ tốt hơn bất cứ khi nào bạn có thể sử dụng std:: mỗi lần thay vì using namespace std. Bằng cách này bạn sẽ chỉ sử dụng các không gian tên mà bạn cần và mã của bạn sẽ dễ đọc hơn vì bạn sẽ tránh xung đột không gian tên (hãy tưởng tượng hai phương thức có cùng tên và thuộc về hai không gian tên khác nhau).

Nhưng quan trọng nhất đâu là câu hỏi số 4?

+1

Xóa dấu gạch dưới kép trước 'FOO_HPP' và tôi sẽ upvote điều này.;) – Maxpm

+1

@Maxpm: Xong :) –

1

Thông thường, bạn đặt khai báo lớp (bao gồm khai báo thành viên) vào tệp tiêu đề và định nghĩa của hàm thành viên (phương thức) trong tệp nguồn. Tiêu đề thường có tên như *.h hoặc *.hpp. Về điểm 3, bạn nên đặt các bộ bảo vệ vào các tiêu đề của bạn để chúng có thể được bao gồm an toàn nhiều lần trong cùng một tệp nguồn; sau đó bạn có thể bao gồm chúng ở mọi nơi bạn cần chúng. Tôi không hiểu điểm số 5: bạn có hỏi về thời điểm sử dụng tiêu chuẩn không gian tên std:: không?

1

Đối với vấn đề "bao gồm hai lần", đây là một mô hình phổ biến cho các tập tin tiêu đề của bạn:

// _BLAHCLASS_H_ should be different for each header, otherwise things will Go Bad. 
#ifndef _BLAHCLASS_H_ 
#define _BLAHCLASS_H_ 

... rest of header ... 

#endif 
+4

Các tên bắt đầu bằng hai dấu gạch dưới được dành riêng cho việc thực hiện trình biên dịch; bạn nên sử dụng một mẫu khác cho các nhân viên bảo vệ của bạn (ví dụ: 'BLAHCLASS_H_INCLUDED'). –

+1

Đồng ý với điểm chung, nhưng thỏa thuận với những người sử dụng dấu gạch dưới kép là gì (tôi thấy ở mọi nơi). Không phải những tên này được dành riêng cho việc triển khai? (Họ trông xấu xí, quá) –

+0

hôm nay tôi đã học được điều gì đó về đôi gạch dưới. – geofftnz

2
  1. Nói chung, vâng. Nó giúp với tổ chức. Tuy nhiên, đối với các dự án nhỏ, nó có thể không phải là một vấn đề lớn.

  2. Tôi đang gặp sự cố khi hiểu câu hỏi tại đây. Nếu bạn hỏi nơi đặt chỉ thị #include, tệp triển khai phải bao gồm tệp tiêu đề.

  3. Có, nhưng việc sử dụng include guards ngăn ngừa nhiều tạp chất.

1
  1. Miễn là chúng không phải là mẫu, nói chung là có. Mẫu (cho tốt hơn hoặc tệ hơn) phải được đặt trong tiêu đề.
  2. Tôi muốn làm cho mỗi tiêu đề của mình "độc lập", vì vậy nếu tiêu đề khác cần thiết để nó hoạt động, nó bao gồm tiêu đề đó (ví dụ: nếu tôi có một lớp sử dụng std::string, tiêu đề cho lớp đó sẽ Với một vài trường hợp ngoại lệ đặc biệt, các tiêu đề chuẩn được yêu cầu phải được viết để bạn có thể bao gồm nhiều hơn một lần mà không thay đổi bất kỳ điều gì (ngoại lệ chính là assert.h/cassert, có thể có ý nghĩa bao gồm nhiều hơn nhiều hơn một lần)
  3. Tôi không chắc chắn chính xác những gì bạn đang yêu cầu. Nếu bạn hỏi về chỉ thị sử dụng như using namespace std;, thì đó là thường là (mặc dù chắc chắn không phải phổ quát) không thích. Tuyên bố sử dụng như using std::vector; thường được coi là ít có vấn đề.
+0

Có nhiều cách để tách riêng việc triển khai mẫu khỏi tuyên bố của nó, nhưng điều đó có lẽ nằm ngoài phạm vi của câu hỏi này. – Maxpm

2
  1. Bạn thường làm như vậy, nhưng đối với các dự án tương đối nhỏ, bạn có thể tránh tệp triển khai càng nhiều càng tốt;
  2. Nếu tiêu đề của bạn chỉ sử dụng các loại không đầy đủ từ <iostream>, bạn có thể tránh bao gồm nó, nhưng bạn sẽ cần forward declarations cho các loại này (xem When to use forward declaration?). Tuy nhiên, để đơn giản, nếu loại sử dụng mẫu, tôi thường bao gồm tiêu đề tương ứng;
  3. No. include guards đảm bảo rằng tiêu đề chỉ được bao gồm một lần trong cùng một translation unit;
  4. Một thực tiễn tốt thông thường là không đặt using namespace std vào tệp tiêu đề. Hãy nhận biết về xung đột không gian tên;
Các vấn đề liên quan