我想知道是否有可能创建仅静态可用的类方法。

给定一个简单的Vector3类:

class Vector3
{
public:
    float X;
    float Y;
    float Z;

    Vector3(): X(0), Y(0), Z(0) {}
    Vector3(float x, float y, float z): X(x), Y(y), Z(z) {}
    static Vector3 CrossProduct(const Vector3& rhs, const Vector3& lhs);
};

Vector3 Vector3::CrossProduct(const Vector3& rhs, const Vector3& lhs)
{
    Vector3 crossProductVec;

    crossProductVec.X = rhs.Y * lhs.Z - rhs.Z * lhs.Y;
    crossProductVec.Y = rhs.Z * lhs.X - rhs.X * lhs.Z;
    crossProductVec.Z = rhs.X * lhs.Y - rhs.Y * lhs.X;

    return crossProductVec;
}


我可以这样使用它:

Vector3 vec1(0,1,0);
Vector3 vec2(1,0,0);

Vector3::CrossProduct(vec1, vec2); //this should work, and does.
                                   //Static CrossProduct method.

vec1.CrossProduct(vec1, vec2);     //this shouldn't work, but it does.
                                   //I don't want the CrossProduct
                                   //instance method to be available


我希望CrossProduct仅可静态使用。这可能吗?

我知道上面的代码无法实现我想要的,我想知道可以进行哪些更改来实现我想要的。

编辑:

CrossProduct()不必一定是该类的一部分,但我希望它以Vector3::CrossProduct()的形式出现。我愿意接受所有建议以达到所需的结果。之后,可以确定是否是一个好主意。

最佳答案

不,我认为没有办法做您想要的事情,但是您可以(and possibly should)使该函数成为名称空间中的非成员非友元函数,最好是与Vector3相同的名称空间。就像是:

namespace Math {
   Vector3 CrossProduct(const Vector3& rhs, const Vector3& lhs);
}


然后,您可以将其用于:

Math::CrossProduct(vec1, vec2);


请注意,如果Vector3与CrossProduct在相同的命名空间中,则可以使用argument dependent lookup (ADL)并根据需要省略Math::

关于c++ - C++仅静态方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23588506/

10-08 23:34