如何在 C++ 中实现静态 类?
How to implement static classes in c++?
我想实现一个简单的静态 class,它在练习时用 C++ 计算整数的 pow 值。所以我的代码在这里:
#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
^~~~~~
请帮我解决问题。
C++ 没有 "static classes",因为它们正式存在于其他语言中。但是,您可以删除默认构造函数 (C++ >= 11) 或将其设为私有且未实现 (C++ < 11),这与使类型不可构造的效果相同:
// 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) error: 'Math::Math()' is private within this context
然而,"static classes" 主要是 C++ 中的反模式,自由函数应该是首选。 (在某些情况下,static classes 可能很有用,特别是在进行模板元编程时。如果您不这样做,那么您几乎肯定不需要 static class。)
考虑改为在命名空间中声明函数:
namespace math {
int pow(int, int);
}
我想实现一个简单的静态 class,它在练习时用 C++ 计算整数的 pow 值。所以我的代码在这里:
#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
^~~~~~
请帮我解决问题。
C++ 没有 "static classes",因为它们正式存在于其他语言中。但是,您可以删除默认构造函数 (C++ >= 11) 或将其设为私有且未实现 (C++ < 11),这与使类型不可构造的效果相同:
// 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)
error: 'Math::Math()' is private within this context
然而,"static classes" 主要是 C++ 中的反模式,自由函数应该是首选。 (在某些情况下,static classes 可能很有用,特别是在进行模板元编程时。如果您不这样做,那么您几乎肯定不需要 static class。)
考虑改为在命名空间中声明函数:
namespace math {
int pow(int, int);
}