2012-03-06 29 views
90

Tôi đang bối rối về cách tách riêng mã thực thi và khai báo của một lớp đơn giản thành một tiêu đề mới và tệp cpp. Ví dụ, làm cách nào để tách mã cho lớp sau?Tách mã lớp thành một tiêu đề và tệp cpp

class A2DD 
{ 
    private: 
    int gx; 
    int gy; 

    public: 
    A2DD(int x,int y) 
    { 
    gx = x; 
    gy = y; 
    } 

    int getSum() 
    { 
    return gx + gy; 
    } 
}; 
+6

Chỉ cần một vài ý kiến: Các nhà xây dựng nên thường xuyên sử dụng một danh sách khởi tạo thay vì cài đặt các thành viên trong cơ thể. Đối với một lời giải thích tốt và đơn giản, xem: http://www.codeguru.com/forum/showthread.php?t=464084 Nó cũng là, ít nhất là hầu hết các nơi, phong tục để có lĩnh vực công cộng ở đầu trang. Nó sẽ không ảnh hưởng đến bất cứ điều gì, nhưng vì các lĩnh vực công cộng là tài liệu của lớp học của bạn, nó có ý nghĩa để có điều đó ở đầu trang. – martiert

+1

@martiert Có 'công khai:' thành viên ở đầu _could_ ảnh hưởng đến _lot_, nếu người dùng di chuyển chúng theo lời khuyên này - nhưng đã đặt hàng sự phụ thuộc giữa các thành viên và chưa biết rằng các thành viên được khởi tạo theo thứ tự tuyên bố của họ; -) –

+1

@underscore_d đúng. Nhưng sau đó một lần nữa, tất cả chúng ta biên dịch với những lời cảnh báo là lỗi và tất cả những cảnh báo mà chúng ta có thể nghĩ đến, đúng không? Điều đó ít nhất sẽ cho bạn biết rằng bạn đang vặn vẹo điều này, nhưng vâng, mọi người sử dụng cách để cảnh báo ít, và chỉ bỏ qua chúng: ( – martiert

Trả lời

138

Khai báo lớp sẽ đi vào tệp tiêu đề. Điều quan trọng là bạn thêm #ifndef bao gồm nhân viên bảo vệ hoặc nếu bạn đang sử dụng nền tảng MS, bạn cũng có thể sử dụng #pragma once. Ngoài ra tôi đã bỏ qua riêng tư, theo mặc định các thành viên lớp C++ là riêng tư.

// A2DD.h 
#ifndef A2DD_H 
#define A2DD_H 

class A2DD 
{ 
    int gx; 
    int gy; 

public: 
    A2DD(int x,int y); 
    int getSum(); 

}; 

#endif 

và thực hiện đi trong file CPP:

// A2DD.cpp 
#include "A2DD.h" 

A2DD::A2DD(int x,int y) 
{ 
    gx = x; 
    gy = y; 
} 

int A2DD::getSum() 
{ 
    return gx + gy; 
} 
+27

Hãy nhớ rằng nếu bạn đang làm lập trình mẫu, thì bạn phải giữ mọi thứ trong tệp .h để trình biên dịch sẽ khởi tạo đúng mã tại thời điểm biên dịch. – linello

+0

im nhận được một lỗi với một biểu tượng trùng lặp im không chắc chắn làm thế nào để slove nó .ld: biểu tượng trùng lặp A2DD :: A2DD (int, int) trong ./src/rstring.o và ./src/A2DD.o cho kiến ​​trúc x86_64 – drdrdr

+1

bạn có công cụ '# ifndef' trong tiêu đề không? – fritzone

5

Về cơ bản một cú pháp sửa đổi của khai báo hàm/định nghĩa:

a2dd.h

class A2DD 
{ 
private: 
    int gx; 
    int gy; 

public: 
    A2DD(int x,int y); 

    int getSum(); 
}; 

a2dd.cpp

A2DD::A2DD(int x,int y) 
{ 
    gx = x; 
    gy = y; 
} 

int A2DD::getSum() 
{ 
    return gx + gy; 
} 
2

Bạn rời khỏi tờ khai trong file header:

class A2DD 
{ 
    private: 
    int gx; 
    int gy; 

    public: 
    A2DD(int x,int y); // leave the declarations here 
    int getSum(); 
}; 

Và đặt các định nghĩa trong tệp triển khai.

A2DD::A2DD(int x,int y) // prefix the definitions with the class name 
{ 
    gx = x; 
    gy = y; 
} 

int A2DD::getSum() 
{ 
    return gx + gy; 
} 

Bạn có thể kết hợp hai (ví dụ: getSum() định nghĩa trong tiêu đề). Điều này rất hữu ích vì nó mang lại cho trình biên dịch một cơ hội tốt hơn ở nội tuyến chẳng hạn. Nhưng nó cũng có nghĩa là việc thay đổi việc thực hiện (nếu còn lại trong tiêu đề) có thể kích hoạt việc xây dựng lại tất cả các tệp khác bao gồm tiêu đề.

Lưu ý rằng đối với mẫu, bạn cần giữ tất cả mẫu trong tiêu đề.

+1

Đặt thành viên và chức năng riêng tư trong tệp tiêu đề không được coi là chi tiết triển khai bị rò rỉ? – Jason

+0

@ Jason, sắp xếp. Đó là những chi tiết triển khai * cần thiết *. Ví dụ: tôi phải biết bao nhiêu không gian mà một lớp sẽ tiêu thụ trên ngăn xếp. Triển khai chức năng không cần thiết cho các đơn vị biên dịch khác. –

3

A2DD.h

class A2DD 
{ 
    private: 
    int gx; 
    int gy; 

    public: 
    A2DD(int x,int y); 

    int getSum(); 
}; 

A2DD.cpp

A2DD::A2DD(int x,int y) 
    { 
    gx = x; 
    gy = y; 
    } 

    int A2DD::getSum() 
    { 
    return gx + gy; 
    } 

Ý tưởng là để giữ đầy đủ chữ ký chức năng và các thành viên trong file header.
Điều này sẽ cho phép các tệp dự án khác xem lớp trông như thế nào mà không cần phải biết triển khai.

Và bên cạnh đó, bạn có thể bao gồm các tệp tiêu đề khác trong triển khai thay vì tiêu đề. Điều này quan trọng vì bất kỳ tiêu đề nào được bao gồm trong tệp tiêu đề của bạn sẽ được bao gồm (được kế thừa) trong bất kỳ tệp nào khác bao gồm tệp tiêu đề của bạn.

1

Thông thường, bạn đặt chỉ khai báo và chức năng inline thực sự ngắn trong file header:

Ví dụ:

class A { 
public: 
    A(); // only declaration in the .h unless only a short initialization list is used. 

    inline int GetA() const { 
    return a_; 
    } 

    void DoSomethingCoplex(); // only declaration 
    private: 
    int a_; 
}; 
9

Nói chung, .h của bạn chứa phân lớp, đó là tất cả dữ liệu của bạn và tất cả khai báo phương thức của bạn.Như thế này trong trường hợp của bạn:

A2DD.h: 

class A2DD 
{ 
    private: 
    int gx; 
    int gy; 

    public: 
    A2DD(int x,int y);  
    int getSum(); 
}; 

Và sau đó cpp của bạn có chứa các triển khai của các phương pháp như thế này:

A2DD.cpp: 

A2DD::A2DD(int x,int y) 
{ 
    gx = x; 
    gy = y; 
} 

int A2DD::getSum() 
{ 
    return gx + gy; 
} 
Các vấn đề liên quan