Создание контейнера «вещь» в C ++ для хранения статических функций.Какой должна быть «вещь»? - PullRequest
5 голосов
/ 20 августа 2010

В настоящее время я создаю набор общих функций (реализации алгоритма поиска) и думаю, что неправильно делаю группировку.На данный момент у меня есть класс Sorting, который объявлен в файле с именем Sorting.h (кстати, он еще далеко не закончен, кстати):

#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 */

Теперь, поскольку конструктор является закрытым,пользователь не может создать экземпляр моего класса - он просто является держателем статических функций, которые пользователь может вызывать.Однако из того, что я читал о C ++ до сих пор - и из просмотра библиотек STL и т. Д. - я думаю, что я делаю это неправильно.Должен ли я вместо этого иметь пространство имен с именем «Сортировка» или что-то в этом роде?Если да, то как выглядит мой заголовочный файл (тот, который будет включать пользователь)?И придется ли мне менять структуру остальных файлов?На данный момент каждый набор алгоритмов находится в своем собственном файле cpp (т.е. BubbleSort.cpp, CocktailSort.cpp и т. Д.).

Извинения за то, что может быть повторяющимся вопросом - я действительно искал C ++ и пространство имен, ноЯ получил очень общие вопросы о пространствах имен, и ни одна из этих проблем не казалась такой.

Ответы [ 3 ]

4 голосов
/ 20 августа 2010

Использовать пространство имен.Вызывающие код не должны заботиться.Кроме того, вам нужно шаблонировать для любого сортируемого типа - сортировка, которая может сортировать только вектор целых чисел, довольно плохая.Придерживайтесь определения, предоставленного 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
    }
};

Вызывающему абоненту все равно, статически ли вы находитесь в классе, но простой факт заключается в том, что вы тратите семантику и время, затрачивая ее накласс, и это не точно представляет намерение.Это не так, по сути, но это довольно плохо.Использование пространства имен также позволяет вызывающим абонентам использовать сортировку пространства имен;семантика.

1 голос
/ 20 августа 2010

Неважно, бесплатная функция в пространстве имен достигает того же.Синтаксис для его вызова идентичен.

0 голосов
/ 20 августа 2010

Я рекомендую использовать пространство имен, если не требуется создавать экземпляр класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...