it-swarm-vi.com

Phải làm gì nếu tôi ghét các tệp tiêu đề C ++?

Tôi luôn luôn bối rối về các tập tin tiêu đề. Chúng rất lạ: bạn bao gồm tệp .h không bao gồm .cpp nhưng .cpp cũng được biên dịch theo cách nào đó.

Gần đây tôi đã tham gia một dự án nhóm, và tất nhiên, cả .h và .cpp đều được sử dụng.
[.__.] Tôi hiểu rằng điều này rất quan trọng, nhưng tôi không thể sống với việc sao chép dán mọi khai báo hàm trong mỗi lớp mà chúng ta có.

Làm cách nào để xử lý quy ước 2 tệp một cách hiệu quả?
[.___.] Có công cụ nào để trợ giúp điều đó không, hoặc tự động thay đổi một tệp trông giống như ví dụ dưới đây thành .h và .cpp? (cụ thể cho MS VC++ 2010)

class A
{
...
    Type f(Type a,Type b)
    {
        //implementation here, not in another file!
    }
...
};

Type f(Type a)
{
     //implementation here
}
...
25
Oleh Prypin

Bạn có thể sử dụng Lzz . Đây là một công cụ dòng lệnh lấy các khai báo được viết bằng cú pháp C++ và tạo các tệp tiêu đề và nguồn.

3
Mario Becerra

Viết thêm Tái cấu trúc C++ thân thiện

Trong C++, bạn không để sử dụng các tiêu đề. Bạn có thể định nghĩa toàn bộ đối tượng trong một tệp giống như với C # hoặc Java. Các nhà phát triển C thường sẽ chỉ giữ các cuộc gọi bên ngoài trong một tệp tiêu đề. Tất cả các cuộc gọi nội bộ sẽ được xác định trong tệp .c. Với cùng một mã thông báo, bạn có thể dự trữ các tệp C++ .h của mình cho các lớp/giao diện (các lớp trừu tượng ảo thuần túy)/vv. được dự định chia sẻ bên ngoài DLL. Đối với các lớp/cấu trúc/giao diện nội bộ, v.v. bạn chỉ cần bao gồm tệp .cpp bạn cần:

#include<myclass.cpp>

Đây dường như không phải là cách tiếp cận phổ biến nhất, nhưng đó là C++ hợp pháp. Nó chắc chắn sẽ là một khả năng cho tất cả các mã nội bộ của bạn. Điều này cho phép mã nội bộ và tập hợp các lớp thay đổi hoàn toàn hơn rất nhiều trong khi cung cấp giao diện ổn định hơn cho mã bên ngoài thư viện/tệp thực thi của bạn để tương tác.

Có cả lớp của bạn trong một tệp sẽ giúp bạn dễ dàng thực hiện những gì bạn muốn. Nó sẽ không giải quyết vấn đề đổi tên một phương thức và phải tìm kiếm mọi nơi mà phương thức đó được gọi, nhưng nó sẽ đảm bảo bạn có các thông báo lỗi dễ hiểu hơn. Không có gì tệ hơn việc tiêu đề của bạn khai báo một phương thức theo một cách, nhưng bạn thực hiện nó theo cách khác. Mã khác gọi tệp tiêu đề sẽ biên dịch đúng và bạn sẽ nhận được ngoại lệ liên kết, trong khi tệp triển khai sẽ là mã phàn nàn rằng phương thức không được xác định. Khi bạn xác định mọi phương thức tại chỗ (trong khai báo lớp thực tế), bạn sẽ nhận được thông báo lỗi tương tự cho dù tệp nào có chứa nó.

Bạn cũng có thể muốn xem câu hỏi này: Công cụ tái cấu trúc tốt cho C++

Làm thế nào C/C++ giải quyết các tệp tiêu đề/thực hiện

Ở cấp độ C cơ sở (và C++ được xây dựng trên nền tảng đó), các tệp tiêu đề khai báo lời hứa của một hàm/struct/biến đủ để cho phép một trình biên dịch để tạo tập tin đối tượng. Tương tự các tệp tiêu đề C++ khai báo lời hứa của các hàm, cấu trúc, lớp, v.v ... Đây là định nghĩa mà trình biên dịch sử dụng để dự trữ không gian trong ngăn xếp, v.v.

Các tập tin .c hoặc .cpp có triển khai. Khi trình biên dịch chuyển đổi từng tệp thực hiện thành một tệp đối tượng, có các móc nối với các khái niệm chưa được thực hiện (những gì đã được khai báo trong tiêu đề). Trình liên kết liên kết các hook với các cài đặt trong các tệp đối tượng khác và tạo ra một nhị phân lớn hơn bao gồm tất cả các mã (thư viện dùng chung hoặc tệp thực thi).

Cụ thể VS

Khi làm việc với những người trong Visual Studio, có một số trình hướng dẫn giúp mọi thứ dễ dàng hơn một chút. Trình hướng dẫn lớp mới sẽ tạo cặp tệp thực hiện và tiêu đề phù hợp của bạn. Thậm chí còn có một tính năng trình duyệt lớp sẽ cho phép bạn khai báo các phương thức mới. Nó sẽ đưa định nghĩa vào tiêu đề và cuống triển khai trong tệp .cpp. Visual Studio đã có những tính năng đó trong hơn một thập kỷ (miễn là tôi đã sử dụng chúng).

16
Berin Loritsch

Trở thành nhà phát triển Java.

Nếu bạn thực sự phải tiếp tục phát triển trong C++, bạn có thể thử sử dụng IDE. Thường thì họ cung cấp một số cơ chế để bạn có thể thêm một phương thức vào một lớp và nó tự động đặt khai báo trong tệp .h và định nghĩa trong tệp .cpp.

13
Paul Butcher

Bạn có thể quan tâm đến chương trình makeheaders từ Hwaci (những người làm SQLite và Fossil).

Ngoài ra hãy xem cách Fossil được xây dựng để có ý tưởng.

8
Benoit

Khi bạn viết những dòng đầu tiên của một lớp mới, thường là vì bạn chỉ cần nó ở một nơi duy nhất tại thời điểm đó. Sau đó, nó có thể được sử dụng ở nhiều nơi hơn, nhưng ban đầu nó thường không được sử dụng.

Nhiều lớp học của tôi bắt đầu ở đầu tệp .cpp hiện tại. Khi nó đã đủ ổn định để sử dụng nó ở nhiều nơi, tôi cắt-dán nó vào một tiêu đề. Mặc dù thường thì lớp biến mất nhanh như nó xuất hiện.

5
Sjoerd

Tệp Header (.h) mô tả giao diện cho mã, bởi vì đó là chỉ bit mà khác mã được xem.

Tệp Nguồn (.cpp) cung cấp việc triển khai mã mà không ai khác cần biết.

bạn bao gồm tệp .h không bao gồm .cpp ...

Chính xác.

Là người tiêu dùng mã này, bạn chỉ cần tệp Tiêu đề để trình biên dịch biết những gì có sẵn trong mã đó để bạn làm việc với. Mã nguồn C++ không được sử dụng dưới bất kỳ hình thức, hình dạng hoặc hình thức nào tại thời điểm này (hoặc, ít nhất, nó không nên be).

... nhưng .cpp bằng cách nào đó cũng được biên dịch.

Đúng vậy, nhưng hoàn toàn riêng biệt.

Tệp .cpp của mô-đun/thư viện mà bạn đang sử dụng được Nhà phát triển của thư viện đó biên dịch thành tệp Đối tượng (.o /. Tệp đối tượng đó sẽ chứa các điểm nhập có cùng "hình dạng" như các điểm được mô tả trong tệp Tiêu đề.

Bạn sẽ cần tệp Object đó khi bạn đến link tệp thực thi đã hoàn thành của bạn, tại thời điểm đó, Trình liên kết có thể lấy nội dung của tệp Object và nhúng nó vào tệp thực thi của bạn (đó là liên kết tĩnh; phức tạp hơn)
[.__.] Về cơ bản, trình liên kết phải "nối các dấu chấm" giữa các điểm nhập mà mã của bạn mong đợi để có thể gọi, dựa trên những gì nó thấy trong tệp Tiêu đề và những gì thực sự có trong chính thư viện).

0
Phill W.