静态助手类

时间:2011-11-09 15:36:30

标签: c++

在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 ++等价物来提供这种功能?

6 个答案:

答案 0 :(得分:8)

简单的答案是使用::运算符代替.运算符:

float Variable1 = MathsClass::MultiplyByThree(Variable1); 

但是在C ++中,自由函数通常比静态类函数更受欢迎,除非您有特定的理由将它们放在类中。为了将它们保持在一起,而不是污染全局命名空间,可以将它们放在它们自己的命名空间中:

在Math.h中

namespace Math
{
    float MultiplyByThree(float x);
}

在Math.cpp中:

#include "math.h"

namespace Math
{
    float MultiplyByThree(float x)
    {
        return x * 3;
    }
}

使用它:

#include "math.h"

float Variable1 = Math::MultiplyByThree(Variable1); 

更好的是,将它设为模板,相同的代码适用于浮点数,双精度数,整数,复数或任何已定义operator*的类型:

在Math.h中

namespace Math
{
    template <typename T>
    T MultiplyByThree(T x)
    {
        return x * 3;
    }
}

唯一的问题是你无法将定义分成math.cpp,它必须在标题中。

答案 1 :(得分:4)

使用::代替.

float Variable1 = MathsClass::MultiplyByThree(Variable1);

另外,请确保MultiplyByThree已声明为static

class MathsClass {
...

public:
  static float MultiplyByThree(float arg);

...
}

最后,如果该类完全由静态辅助函数组成,那么您可能希望通过使其构造函数为私有来禁止创建MathsClass实例。

答案 2 :(得分:2)

.运算符仅适用于对象。 ::运算符(作用域解析运算符)用于访问作用域的成员,即命名空间或类型。确切的等价如下:

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.
}

答案 3 :(得分:1)

假设MultiplyByThree是静态方法,您应将其称为:

float var1 = MathsClass :: MultiplyByThree(varx);

答案 4 :(得分:1)

通常,独立函数将放在命名空间而不是类中:

namespace Maths {
    template <typename T> T MultiplyByThree(T const & x) {return x * 3;}
}

然后使用范围解析运算符访问函数:Maths::MultiplyByThree

如果由于某种原因你真的想让它成为类的静态成员,那么语法是相同的:静态成员可以作为class_name::memberobject.member访问,但不能作为{ {1}}。

答案 5 :(得分:0)

使您的类的所有成员都是静态的,并使用:: syntax。

调用它们

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