如何在C ++中实现静态类?

Sas*_*hra 2 c++ static-methods static-classes

我想实现一个简单的静态类,该类可以在练习时计算c ++中整数的pow值。所以我的代码在这里:

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


#endif /* MATH_H */
Run Code Online (Sandbox Code Playgroud)

和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;
}
Run Code Online (Sandbox Code Playgroud)

但是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
 ^~~~~~
Run Code Online (Sandbox Code Playgroud)

请帮助我解决我的问题。这是Microsoft课程的正式文档,据我了解,C ++中有静态类

cdh*_*wie 6

C ++没有“静态类”,因为它们在其他语言中正式存在。但是,您可以删除默认构造函数(C ++> = 11)或将其构造为私有且未实现(C ++ <11),这具有使类型不可构造的相同效果:

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

// C++ < 11
class Math
{
private:
    Math(); // leave unimplemented
};
Run Code Online (Sandbox Code Playgroud)

使用此代码,该行将Math m;失败:

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

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

但是,“静态类”通常是C ++中的反模式,应首选自由函数。(在某些情况下,静态类可能有用,尤其是在进行模板元编程时。如果您不这样做,则几乎可以肯定不需要静态类。)

考虑改为在命名空间中声明函数:

namespace math {
    int pow(int, int);
}
Run Code Online (Sandbox Code Playgroud)

  • @SaswataMishra您显示的示例代码很可能不正确。微软的C ++编译器也有可能接受其他编译器无法接受的非标准功能……这不是第一次。__无论如何,根据标准,“静态类”是无效的C ++。__Microsoft的编译器是否接受它是他们的问题。 (3认同)
  • 但微软正在 Edx 平台上推出一门课程,他们正在 Visual Studio 中编写包含 C++ 代码的静态类。:( (2认同)
  • 还没看到“ref class”。但是,是的,他们正在使用 C++。 (2认同)
  • 我还严重质疑任何C ++课程的质量,这些课程甚至讲授了不可构造的类。除非您有一个很好的理由(几乎总是模板元编程),否则这不是在C ++中应使用的东西。__在C ++中使用不可构造的类作为函数的容器是错误的。__诸如C#之类的语言具有此功能,因为它们根本不支持自由函数。 (2认同)