静态帮助程序类
static helper class
在 C# 中,我创建了一个静态类,该类具有许多数学帮助程序函数,我可以直接调用而无需创建该类的实例。我似乎无法让它在C++工作。
例如,如果该类名为MathsClass,并且具有一个名为MultiplyByThree的函数,那么我会像这样使用它:
float Variable1 = MathsClass.MultiplyByThree(Variable1);
在我的代码的C++版本中,我收到错误:
'MathsClass' : illegal use of this type as an expression
和
error C2228: left of '.MultiplyByThree' must have class/struct/union
我将如何编写 C# 静态类的 C++ 等效项来提供此类功能?
简单的答案是使用 ::
运算符而不是 .
运算符:
float Variable1 = MathsClass::MultiplyByThree(Variable1);
但在C++中,自由函数通常比静态类函数更受欢迎,除非你有特定的原因将它们放在类中。 为了将它们放在一起,并且不污染全局命名空间,您可以将它们放在它们自己的命名空间中:
在数学中。
namespace Math
{
float MultiplyByThree(float x);
}
在数学.cpp:
#include "math.h"
namespace Math
{
float MultiplyByThree(float x)
{
return x * 3;
}
}
并使用它:
#include "math.h"
float Variable1 = Math::MultiplyByThree(Variable1);
更好的是,使其成为模板,相同的代码将适用于浮点数、双精度数、整数、复杂值或任何已定义operator*
类型:
在数学中。
namespace Math
{
template <typename T>
T MultiplyByThree(T x)
{
return x * 3;
}
}
唯一的问题是你不能将定义分成数学.cpp,它必须在标题中。
使用 ::
代替 .
:
float Variable1 = MathsClass::MultiplyByThree(Variable1);
此外,请确保MultiplyByThree
声明static
:
class MathsClass {
...
public:
static float MultiplyByThree(float arg);
...
}
最后,如果类完全由静态帮助程序函数组成,则可能需要通过将其构造函数设为私有来禁止创建MathsClass
实例。
.
运算符仅适用于对象。::
运算符(范围解析运算符(用于访问命名空间或类型意义上的作用域的成员。完全等价物是这样的:
class MathsClass
{
static float MultiplyByThree(const float Value);
};
这样称呼它:
float TwoTimesThree = MathsClass::MultiplyByThree(2.0f);
但是,我不建议这样做。请改用命名空间。允许用户创建 MathsClass 对象是否有意义?如果没有,则只需将其设置为命名空间即可。调用函数的语法保持不变。
namespace Maths
{
float MultiplyByThree(const float Value);
}
float TwoTimesThree = Maths::MultiplyByThree(2.0f);
如果您希望内联(或尝试内联(,则可以在标头中定义Maths::MultiplyByThree
,否则,您应该在".CPP"文件。在".CPP"文件,您可以像这样定义它:
namespace Maths
{
float MultiplyByThree(const float Value)
{
// Definition here.
}
}
。或者像这样:
float Maths::MultiplyByThree(const float Value)
{
// Definition here.
}
假设 MultiplyByThree 是一个静态方法,您应该将其调用为:
float var1 = MathsClass::MultiplyByThree(varx(;
通常,独立函数将位于命名空间而不是类中:
namespace Maths {
template <typename T> T MultiplyByThree(T const & x) {return x * 3;}
}
然后,使用范围解析运算符访问函数:Maths::MultiplyByThree
如果出于某种原因你真的想让它成为类的静态成员,那么语法是相同的:静态成员可以作为class_name::member
或object.member
访问,但不能作为class_name.member
访问。
将类的所有成员设为静态,并使用 :: 语法调用它们。
C# 静态类的目的是防止实例化,因此还应在接口的私有部分中创建 MathsClass(( 构造函数,以防止实例化发生:)
- C++调用具有 *this 属性的单个帮助程序函数
- 用于检查值是否为其任何参数的帮助程序函数
- 类型限定宏帮助程序
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 无法将 2D 数组传递到 c++ 中的帮助程序函数中
- C2783: 无法推断帮助程序函数的模板参数
- 友元函数需要一个帮助程序函数
- 在何处放置与类方法相关的帮助程序函数C++
- 给定概念,SFINAE 帮助程序是否仍在规范中作为未弃用?
- 使用 IP 帮助程序的 Windows 中活动 UDP 连接的远程地址
- 如何安装性能数据帮助程序
- 用于向公众公开数据成员的帮助程序结构
- 类参数化与类和帮助程序函数混淆
- 仅具有公共静态方法的帮助程序类
- Ebpf:帮助程序的未定义符号
- 函数和指针帮助:程序生成,但崩溃,没有任何特定错误
- 使用带有 MEX 包装器的帮助程序 C 文件从 MATLAB 2016 调用C++代码时出现问题
- 输入到字符串流并在单个语句中转换为字符串.可以没有帮助程序类
- Wallaroo依赖项和静态帮助程序类
- 静态帮助程序类