簡體   English   中英

C ++靜態方法?

[英]C++ static only methods?

我想知道是否可以創建僅靜態可用的類方法。

給出一個簡單的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() 我願意接受所有建議以達到要求的結果。 在那之后,可以確定是否是一個好主意的決定。

它只能靜態地提供,因為它只能修改類的本地和靜態成員。 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

不,我認為沒有辦法做你想做的事情,但你可以( 並且可能應該 )使函數成為名稱空間中的非成員非友元函數,最好是與Vector3相同的名稱空間。 就像是:

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

然后你可以用它:

Math::CrossProduct(vec1, vec2);

請注意,如果Vector3與CrossProduct位於相同的命名空間中,則可以使用參數相關查找(ADL)並省略Math::如果您願意。

根據您的聲明,這些是相同的

Vector3::CrossProduct(vec1, vec2); 

vec1.CrossProduct(vec1, vec2);    

您的函數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); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM