Как реализовать статические классы в C ++? - PullRequest
2 голосов
/ 15 октября 2019

Я хотел реализовать простой статический класс, который вычисляет значение pow целого числа в c ++ во время практики. Вот мои коды здесь:

#pragma once
#ifndef MATH_H
#define MATH_H
static class Math
{
    public:
        static int pow(int,int);
};


#endif /* MATH_H */

И реализация функции pow:

#include "Math.h"

int Math::pow(int base, int exp){
    if(exp==1)
        return base;
    else if(exp%2==0)
        return pow(base,exp/2)*pow(base,exp/2);
    else
        return pow(base,exp/2)*pow(base,exp/2)*base;
}

Но компилятор cygwin выдает ошибку компиляции:

In file included from Math.cpp:16:0:
Math.h:16:1: error: a storage class can only be specified for objects and functions
 static class Math
 ^~~~~~

Пожалуйста, помогитемне решить мою проблему. Here are the Microsoft course's official documents from where I have been taught that there are static classes in c++

1 Ответ

6 голосов
/ 15 октября 2019

C ++ не имеет «статических классов», поскольку они формально существуют в других языках. Однако вы можете удалить конструктор по умолчанию (C ++> = 11) или сделать его закрытым и не реализованным (C ++ <11), что приводит к тому же эффекту, что делает тип неконструктивным: </p>

// C++ >= 11
class Math
{
public:
    Math() = delete;
};

// C++ < 11
class Math
{
private:
    Math(); // leave unimplemented
};

С этим кодомстрока Math m; потерпит неудачу:

(C ++> = 11) error: use of deleted function 'Math::Math()'

(C ++ <11) <code>error: 'Math::Math()' is private within this context

Тем не менее, «статические классы» в основном являются анти-паттернами в C ++, и предпочтительнее использовать бесплатные функции. (В некоторых случаях статические классы могут быть полезны, особенно при выполнении метапрограммирования шаблонов. Если вы этого не делаете, то вам почти наверняка не нужен статический класс.)

Попробуйте вместо этого объявить функции впространство имен:

namespace math {
    int pow(int, int);
}
...