静态帮助程序类

static helper class

本文关键字:帮助程序 静态      更新时间:2023-10-16

在 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::memberobject.member访问,但不能作为class_name.member访问。

将类的所有成员设为静态,并使用 :: 语法调用它们。

C# 静态类的目的是防止实例化,因此还应在接口的私有部分中创建 MathsClass(( 构造函数,以防止实例化发生:)