2009-12-05 42 views
6

Nếu tôi hiểu chính xác, chúng tôi có ít nhất hai cách triển khai bố cục khác nhau. (Trường hợp thực hiện với con trỏ thông minh được loại trừ vì đơn giản tôi hầu như không sử dụng STL và không có mong muốn tìm hiểu nó..)Cách triển khai thành phần lớp trong C++?

Hãy có một cái nhìn tại Wikipedia example:

class Car 
{ 
    private: 
    Carburetor* itsCarb; 
    public: 
    Car() {itsCarb=new Carburetor();} 
    virtual ~Car() {delete itsCarb;} 
}; 

Vì vậy, đó là một cách - chúng tôi có một con trỏ để đối tượng làm thành viên riêng tư. Người ta có thể viết lại nó trông như thế này:

class Car 
{ 
    private: 
    Carburetor itsCarb; 
}; 

Trong trường hợp đó chúng ta có một đối tượng chính nó như là thành viên tư nhân. (Nhân tiện, tôi có quyền gọi thực thể này là một đối tượng từ quan điểm thuật ngữ không?)

Trong trường hợp thứ hai, không bắt buộc phải gọi hàm khởi tạo mặc định (nếu cần gọi hàm dựng không mặc định) có thể làm điều đó trong danh sách initializer) và destructor. Nhưng nó không phải là một vấn đề lớn ...

Và dĩ nhiên trong một số khía cạnh, hai trường hợp này khác nhau đáng kể hơn. Ví dụ, nó bị cấm gọi các phương pháp không const của bộ chế hòa khí từ các phương pháp const của lớp Car trong trường hợp thứ hai ...

Có "quy tắc" nào để quyết định sử dụng quy tắc nào không? Tui bỏ lỡ điều gì vậy?

+1

Tôi nghĩ rằng bạn có nghĩa là "nó bị cấm gọi các phương pháp không const của bộ chế hòa khí từ các phương pháp const của lớp Car". –

+0

@ Laurence Ooops. Dĩ nhiên, bạn phải ... – Wildcat

+8

"[I] không có mong muốn học [STL]." Gì? Bạn đang thiếu một phần lớn của C++ bằng cách bỏ qua STL. – rlbond

Trả lời

7

Trong trường hợp đó, chúng tôi có đối tượng là thành viên riêng tư. (Nhân tiện, hãy gọi thực thể này làm đối tượng tôi viết từ quan điểm thuật ngữ?)

Có thể nói "một đối tượng" hoặc "một thể hiện" của lớp học.

Bạn cũng có thể nói về việc bao gồm thành viên dữ liệu "theo giá trị" thay vì "bằng con trỏ" (vì "bằng con trỏ" và "theo giá trị" là cách thông thường để nói về các tham số truyền. các điều khoản đó được áp dụng cho các thành viên dữ liệu).

Có bất kỳ "quy tắc" nào để quyết định sử dụng quy tắc nào không? Tôi có nhớ gì không?

Nếu cá thể được chia sẻ bởi nhiều hơn một vùng chứa, thì mỗi vùng chứa phải bao gồm nó bằng con trỏ thay vì giá trị; ví dụ nếu một nhân viên có một cá thể Boss, bao gồm các Boss bằng con trỏ nếu một số trường hợp nhân viên chia sẻ cùng một Boss.

Nếu tuổi thọ của thành viên dữ liệu không giống như tuổi thọ của vùng chứa, hãy bao gồm nó bằng con trỏ: ví dụ nếu thành viên dữ liệu được khởi tạo sau vùng chứa hoặc bị hủy trước vùng chứa hoặc bị hủy và được tái tạo trong suốt thời gian tồn tại của vùng chứa hoặc nếu nó có ý nghĩa đối với thành viên dữ liệu là rỗng.

Lần khác khi bạn phải bao gồm bởi con trỏ (hoặc tham chiếu) thay vì theo giá trị là khi loại thành viên dữ liệu là lớp cơ sở trừu tượng.

Một lý do khác để bao gồm bởi con trỏ là có thể cho phép bạn thay đổi việc triển khai thành viên dữ liệu mà không cần biên dịch lại vùng chứa. Ví dụ: nếu ô tô và Bộ chế hòa khí được xác định trong hai tệp DLL khác nhau, bạn có thể muốn bao gồm Bộ chế hòa khí theo con trỏ: vì sau đó bạn có thể thay đổi cài đặt Bộ chế hòa khí bằng cách cài đặt Carburetor.dll khác, mà không cần xây dựng lại Car.dll.

+0

+1 để đề cập đến tài liệu tham khảo vì chúng dường như đã bị bỏ qua cho đến nay – Glen

3

Thành phần: thích thành viên khi có thể. Sử dụng một con trỏ khi đa hình là cần thiết hoặc khi một tờ khai chuyển tiếp được sử dụng. Tất nhiên, không có con trỏ thông minh, cần quản lý bộ nhớ thủ công khi sử dụng con trỏ.

1

Nếu Carb có cùng tuổi thọ với ô tô, thì biểu mẫu không phải con trỏ sẽ tốt hơn, theo ý kiến ​​của tôi. Nếu bạn phải thay thế Carb trong ô tô thì tôi sẽ chọn phiên bản con trỏ.

8

Tôi có xu hướng thích trường hợp đầu tiên vì yêu cầu thứ hai yêu cầu bạn phải #include Carburettor.h trong Car.h. Vì Bộ chế hòa khí là một thành viên riêng tư, bạn không cần phải bao gồm định nghĩa của nó ở đâu đó ngoài mã thực hiện ô tô thực tế. Việc sử dụng lớp Carburettor rõ ràng là một chi tiết thực hiện và các đối tượng bên ngoài sử dụng đối tượng Ô tô của bạn không phải lo lắng về việc bao gồm các phụ thuộc không bắt buộc khác. Bằng cách sử dụng một con trỏ, bạn chỉ cần sử dụng một tờ khai chuyển tiếp của Bộ chế hòa khí trong Car.h.

+0

Điều này giống nhau trong cả hai trường hợp, vì vậy tôi đã bỏ phiếu này xuống. –

+0

Bạn có thể cụ thể hơn không, Im khá chắc chắn bạn đã không nhận được điểm của tôi ... – nico

+2

Đó là _không giống nhau trong cả hai trường hợp. Như nicolascormier đã chỉ ra, bạn có thể sử dụng một khai báo chuyển tiếp để tránh bao gồm cả tệp tiêu đề. Có lẽ bạn nên hiểu câu trả lời trước khi downvoting. –

0

Nói chung, phiên bản không phải con trỏ dễ sử dụng và bảo trì hơn.

Nhưng trong một số trường hợp, bạn không thể sử dụng. Ví dụ, nếu xe có nhiều bộ chế hòa khí và bạn muốn đặt chúng trong một mảng, và bộ tạo bộ chế hòa khí yêu cầu một đối số: bạn cần phải tạo chúng thông qua mới và do đó lưu trữ chúng dưới dạng con trỏ.

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