Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

В С++ классы с использованием только методов 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

Ответ 3

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

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

Ответ 4

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

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

Ответ 5

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

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

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

    return 0;
}

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

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

Ответ 6

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

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

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

Ответ 7

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