在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 ++等价物来提供这种功能?
答案 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::member
或object.member
访问,但不能作为{ {1}}。
答案 5 :(得分:0)
使您的类的所有成员都是静态的,并使用:: syntax。
调用它们C#静态类的目的是防止实例化,因此您还应该在接口的私有部分中创建MathsClass()构造函数,以防止实例化发生:)