C++ 静态唯一方法?

标签 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()。我愿意接受所有建议以达到所需的结果。之后就可以决定它是否是一个好主意。

最佳答案

不,我认为没有办法做你想做的事,但你可以 ( and possibly should ) 使函数成为命名空间中的非成员非友元函数,最好是与 相同的命名空间 vector 3。像这样的东西:

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

然后你可以使用它:

Math::CrossProduct(vec1, vec2);

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

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

相关文章:

oop - 多重继承的用途?

c++ - 编译器优化如何影响代码逻辑?

java - 在 Java 中从外部访问父类(super class)

c++ - 每个 fread/fwrite 有多少随机/顺序访问?

c++ - setCentralWidget() 导致 QMainWindow 崩溃。为什么?

java - Java 双重哈希问题

java - 如果消除了对多重继承的限制,那么 Java 中的接口(interface)和抽象类有什么区别?

javascript - 在构造函数 javascript 中将属性设置为函数

c++ - 动态内存分配故障恢复

c++ - ISO C++ 禁止声明没有类型的 'uniform_real_distribution'