Преимущества классов с использованием только статических методов в C ++ - PullRequest

Ответы [ 8 ]

31 голосов
/ 08 сентября 2011

Если вы хотите создать коллекцию служебных функций, не перекрывая глобальное пространство имен, вам следует просто создать обычные функции в их собственном пространстве имен:

namespace utility {
    int helper1();
    void helper2();
};

Вы, вероятно, тоже не хотите делать их статическими функциями. В контексте функции, не являющейся членом (в отличие от функции-члена), ключевое слово static в C и C ++ просто ограничивает область действия функции текущим исходным файлом (то есть делает своего рода функцию частной для текущий файл). Обычно он используется только для реализации внутренних вспомогательных функций, используемых библиотечным кодом, написанным на C, так что получающиеся вспомогательные функции не имеют символов, доступных другим программам. Это важно для предотвращения конфликтов между именами, поскольку в C нет пространств имен.

13 голосов
/ 08 сентября 2011

В C ++ классы с только static методами в основном используются в метапрограммировании шаблонов.

Например, я хочу вычислить числа Фибоначчи при времени компиляции , а во время выполнения я хочу, чтобы они печатались только, тогда я могу написать эту программу:

#include <iostream>

template<int N>
struct Fibonacci 
{
   static const int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value;
   static void print()
   {
       Fibonacci<N-1>::print();
       std::cout << value << std::endl;
   }
};


template<>
struct Fibonacci<0>
{
   static const int value = 0;
   static void print()
   {
       std::cout << value << std::endl;
   }
};

template<>
struct Fibonacci<1>
{
   static const int value = 1;
   static void print()
   {
       Fibonacci<0>::print();
       std::cout << value << std::endl; 
   }
};

int main() {
        Fibonacci<20>::print(); //print first 20 finonacci numbers
        return 0;
}

Демо онлайн: http://www.ideone.com/oH79u

6 голосов
/ 08 сентября 2011

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

Я не вижу преимущества в том, чтобы сделать все функции static и поместить их в класс по сравнению с тем, чтобы они были просто бесплатными функциями.Лично я думаю, что с бесплатными функциями проще работать.

2 голосов
/ 08 сентября 2011

Как отмечали многие другие, свободные функции внутри пространства имен - это подход, который часто используется для такого рода вещей в c++.

Один случай, который я бы сделал для классов со всеми статическими функциями, - это когда вы хотите представить набор функций для информации, полученной из параметров шаблона, т.е.

template <typename Ty>
    class utils
{
public :
// if you need to setup a bunch of secondary types, based on "Ty" that will be used 
// by your utility functions
    struct item_type
    { 
        Ty data;
        // etc
    }; 

// a set of utilities
    static void foo(Ty &data1, item_type &item)
    { 
        // etc
    }
};

Вы можете использовать это для достижения эффекта пространства имен шаблона:

int main ()
{
    double data;
    utils<double>::item_type item ;
    utils<double>::foo(data, item);

    return 0;
}

Если вы не используете шаблоны, просто придерживайтесь пространств имен.

Надеюсь, это поможет.

1 голос
/ 08 сентября 2011

В C ++ просто сделайте их свободными функциями.Нет нужды или причины помещать их в класс вообще.Если только вы не разбираетесь с шаблонами.

1 голос
/ 08 сентября 2011

Нет реальной проблемы с объявлением статических методов в классе. Хотя пространства имен больше подходят для этой цели по причинам, указанным в сообщении, на которое вы ссылаетесь.

Использование функций C может привести к коллизиям имен, если только вы не примете решение об именовании, добавив в префикс свои функции, например, btFunctionA, btFunctionB и т. Д. Во избежание этого вы захотите хранить символы в пространствах имен, ведь вы используете C ++, а не C.

Статические функции в пространстве имен ничем не отличаются от нестатических. Я считаю, что ключевое слово static просто игнорируется в этом контексте.

1 голос
/ 08 сентября 2011

Это может соответствовать вашим интересам.Это статья, в которой рассматриваются различные подходы к классам и функциям в Java по сравнению с другими языками.

http://steve -yegge.blogspot.com / 2006/03 / исполнение в королевстве существительных.

0 голосов
/ 05 апреля 2019

Существует еще одна ситуация, в которой статический класс может быть предпочтительнее пространства имен: когда вы хотите сделать данные частными, чтобы их нельзя было напрямую изменить вне класса / пространства имен, но по причинам производительности вы хотите иметь общедоступные встроенные функции, которые работают с ним. Я не думаю, что есть какой-либо способ сделать это с пространством имен, кроме как объявить класс внутри пространства имен.

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