2011-10-13 33 views
5

thể trùng lặp:
Namespace + functions versus static methods on a classC++ - Namespace vs Chức năng tĩnh

Tôi muốn nhóm chức năng tương tự togther. Tôi có thể làm một trong hai cách. Với tôi chúng chỉ là những khác biệt về cú pháp ... cuối cùng nó cũng không thành vấn đề. Chế độ xem này có chính xác không?

Namespace:

namespace util 
    { 
    void print_array(int array[]) 
    { 
    int count = sizeof(array)/sizeof(array[0]); 
    for (int i = 0; i <= count; i++) cout << array[i]; 
    } 
    } 

Class:

class Util 
    { 
    public: 
    static void print_array(int array[]) 
     { 
     int count = sizeof(array); 
     for (int i = 0; i <= count; i++) cout << array[i]; 
     } 
    }; 

Gọi với

Util::print_array() // Class 

hoặc

util::print_array() // Namespace 
+1

Gần đây, chúng tôi đã thảo luận về vấn đề này. Hy vọng rằng ai đó sẽ đăng một liên kết. Không gian tên phải tuân thủ ADL, trong khi các lớp học không phải là; các lớp có thể được tạo khuôn mẫu, trong khi các không gian tên không thể. –

Trả lời

5

Cách thứ hai là ngớ ngẩn và vô nghĩa. Các lớp không phải là không gian tên và không bao giờ được sử dụng như vậy.

Ngoài ra, mã sai, sizeof(array) sẽ không trả lại suy nghĩ của bạn.

+0

Tuy nhiên, các lớp học có thể được tạo mẫu. –

+2

@KerrekSB: Chức năng cũng vậy. Lợi ích là một phần chuyên môn hóa, nhưng nếu bạn biết về điều đó, bạn không hỏi những câu hỏi ngớ ngẩn như thế này. –

+0

Đủ công bằng :-) –

2

Có một số khác biệt ở chỗ cách thứ hai cho phép bạn làm một vài (vô nghĩa) điều rằng cách đầu tiên không:

  • Sử dụng cách thứ hai bạn có thể tạo thể hiện của util sử dụng một trong hai Util foo; hoặc Util* foo = new Util();.
  • Bạn cũng có thể sử dụng Util làm thông số loại cho mẫu (hoặc bất kỳ nơi nào khác mà tên tệp được cho phép). Vì vậy, bạn có thể, ví dụ: tạo một vector<Util>.
  • Bạn cũng có thể tính toán kích thước của Util phiên bản bằng cách sử dụng sizeof(Util).

Vì không có lý do nào bạn muốn có thể thực hiện một trong những điều đó, bạn nên sử dụng cách đầu tiên. Nói chung, bạn hầu như luôn luôn suy nghĩ lại bằng cách sử dụng một lớp học khi không có trường hợp nào bạn muốn khởi tạo nó.

Trên một lưu ý liên quan: Trong code của bạn sizeof(array) tương đương với sizeof(int*) và gần như chắc chắn không làm những gì bạn nghĩ rằng nó (ví dụ: nó không cho bạn biết có bao nhiêu yếu tố nằm trong mảng).