2010-08-19 31 views
5

Tôi hiện đang xây dựng một tập hợp các chức năng phổ biến (Triển khai thuật toán tìm kiếm) và nghĩ rằng tôi đang làm sai nhóm. Tại thời điểm này, tôi có một lớp học, Phân loại, đó là tuyên bố trong một tập tin gọi là Sorting.h (nó nơi nào gần xong chưa, btw) như sau:Tạo vùng chứa 'điều' trong C++ để giữ các chức năng tĩnh. 'Điều' nên là gì?

#ifndef SORTING_H 
#define SORTING_H 

#include <vector> 

class Sorting { 

private: 
    Sorting(); 
    Sorting(const Sorting& orig); 
    virtual ~Sorting(); 

public: 
    static void bubbleSort(std::vector<int>& A); 
    // etc 
}; 

#endif /* SORTING_H */ 

Bây giờ, vì các nhà xây dựng là tư nhân, một người sử dụng không thể khởi tạo lớp của tôi - nó có hiệu quả chỉ là một chủ cho các hàm tĩnh mà người dùng có thể gọi. Tuy nhiên, từ những gì tôi đã đọc của C + + cho đến nay - và từ nhìn vào các thư viện STL vv - Tôi nghĩ rằng tôi đang làm điều này sai. Thay vào đó tôi có nên có một không gian tên gọi là 'Phân loại' hay một thứ gì đó sắp xếp? Nếu vậy, tập tin tiêu đề của tôi (cái mà người dùng sẽ bao gồm) trông như thế nào? Và tôi có phải thay đổi cấu trúc của các tệp còn lại không? Hiện tại, mỗi bộ thuật toán nằm trong tệp cpp của chính nó (ví dụ: BubbleSort.cpp, CocktailSort.cpp, v.v.).

Xin lỗi vì câu hỏi trùng lặp - Tôi đã tìm kiếm C++ và không gian tên, nhưng tôi có những câu hỏi rất chung về không gian tên và không có vấn đề cụ thể nào.

Trả lời

4

Sử dụng không gian tên. Người gọi mã sẽ không cần phải quan tâm. Ngoài ra, bạn cần phải mẫu trên bất kỳ loại có thể sắp xếp - một loại mà chỉ có thể sắp xếp một vectơ số nguyên là khá xấu. Dính vào định nghĩa được cung cấp bởi std :: sort.

namespace Sorting { 
    template<typename Iterator> void cocktail_sort(Iterator a, Iterator b) { 
     // implement cocktail sort 
    } 
    template<typename Iterator> void bubble_sort(Iterator a, Iterator b) { 
     // implement bubble sort 
    } 
}; 

Người gọi sẽ không quan tâm cho dù bạn tĩnh trong lớp học, nhưng thực tế đơn giản là bạn lãng phí ngữ nghĩa và thời gian trong lớp học, và nó không thể hiện chính xác ý định. Nó không phải là sai, mỗi người, nhưng nó là kinda xấu. Sử dụng một không gian tên cũng cho phép người gọi sử dụng không gian tên đang sử dụng Phân loại; ngữ nghĩa.

+0

'(Iterator đầu tiên, Iterator last)', để minh hoạ. – Potatoswatter

+0

Cảm ơn. Tôi sẽ sớm chuyển sang các mẫu, tôi chỉ cố gắng tìm hiểu cách bạn cho biết một lớp/nguyên thủy có thể so sánh được trong C++ - tức là làm cách nào để biết rằng nó sẽ hoạt động khi "<" vv được gọi trên đó. Hay đó là điều mà người dùng cuối phải lo lắng? Như một câu hỏi khác - ở đây bạn đã đặt cocktail_sort và bubble_sort trong cùng một khai báo không gian tên - tôi có thể sử dụng nhiều tệp riêng biệt cho điều này không? – Stephen

+0

@DeadMG: Hai đề xuất: 1. Tên loại thường mô tả loại trình vòng lặp được yêu cầu, ví dụ: 'RandomAccessReadableWriteableIterator' hoặc' ForwardReadableWriteableIterator'. 2. Để thay thế cho các trình vòng lặp, bạn có thể sử dụng các phạm vi, linh hoạt hơn và dễ sử dụng hơn. – Philipp

1

Nó không quan trọng, một chức năng miễn phí trong một không gian tên đạt được như nhau. Cú pháp gọi nó giống hệt nhau.

0

Tôi sẽ khuyên bạn nên sử dụng không gian tên nếu lớp đó không được khởi tạo.

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