C ++静态方法?

时间:2014-05-11 03:11:13

标签: c++ oop

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

给出一个简单的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()。我愿意接受所有建议以达到要求的结果。在此之后,可以确定是否是一个好主意的决定。

4 个答案:

答案 0 :(得分:1)

它只能静态地提供,它只能修改类的本地和静态成员。 vect.CrossProduct()将编译为Vector3::CrossProduct()

你似乎坚持不拥有会员功能,我不知道为什么。如果没有成员函数,那么如何拥有一个无法修改自身的const成员函数:

class Vector3f
{
    //...
    public:
        Vector3f CrossProduct( const Vector3f& v ) const;
};

Vector3f Vector3f CrossProduct( const Vector3f& v ) const
{
    //...
}

v1.CrossProduct( v1, v2 ); // compiler error: parameter lists don't match

答案 1 :(得分:1)

不,我不认为有办法做你想做的事情,但你可以(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::

答案 2 :(得分:0)

根据您的声明,这些是相同的

Vector3::CrossProduct(vec1, vec2); 

vec1.CrossProduct(vec1, vec2);    

答案 3 :(得分:0)

您的函数Crossproduct只需要在类定义之外声明为单独的函数。

  

Vector3 CrossProduct(const Vector3& lhs,const Vector3& rhs);

或者您不是将其设为静态,只需将其声明为常规成员函数,如

  

Vector3 CrossProduct(const Vector3& rhs);

使用*this作为LHS。

我建议你同时做这两件事;

class vector3 {
  ....
  Vector3 CrossProduct(const Vector3& rhs);
};
inline Vector3 CrossProduct(const Vector3& lhs, const Vector3& rhs) { return lhs.Crossproduct(rhs); }