In basso ho una classe chiamata Vector con al suo interno una static member function chiamata getDotProduct().
Come si vede da main, l'utilizzo voluto è "float dotProduct = Vector::getDotProduct(v1, v2);" insomma usando il nome della classe come una sorta di namespace, però allo stesso tempo vorrei impedire la chiamata di questa member function ad istanze di Vector, percui vorrei impedire una chiamata del tipo "float dotProduct = v3.getDotProduct(v1,v2);" perchè non ha senso chiamare v3 quando il risultato ritornato dalla funzione non ha nulla a che vedere con v3.
Percui, c'è un mondo per impedire quest'ultimo tipo di chiamata? :)
Come si vede da main, l'utilizzo voluto è "float dotProduct = Vector::getDotProduct(v1, v2);" insomma usando il nome della classe come una sorta di namespace, però allo stesso tempo vorrei impedire la chiamata di questa member function ad istanze di Vector, percui vorrei impedire una chiamata del tipo "float dotProduct = v3.getDotProduct(v1,v2);" perchè non ha senso chiamare v3 quando il risultato ritornato dalla funzione non ha nulla a che vedere con v3.
Percui, c'è un mondo per impedire quest'ultimo tipo di chiamata? :)
Codice:
#include <iostream>
using namespace std;
class Vector {
public:
Vector(float _x = 0, float _y = 0, float _z = 0) : x{ _x }, y{ _y }, z{ _z } { computeMagnitude(); }
friend ostream& operator<<(ostream&, const Vector&);
friend Vector operator*(const Vector&, const Vector&);
friend Vector operator+(const Vector&, const Vector&);
friend Vector operator-(const Vector&, const Vector&);
inline void computeMagnitude() { magnitude = sqrt(x*x + y*y + z*z); }
inline Vector getNormalizedVector() { return Vector(x / magnitude, y / magnitude, z / magnitude); }
static inline float getDotProduct(const Vector& lhs, const Vector& rhs) { Vector v = lhs*rhs; return v.x + v.y + v.z; }
float x;
float y;
float z;
float magnitude;
};
ostream& operator<<(ostream& stream, const Vector& v)
{
return stream << "x,y,z{" << v.x << "," << v.y << "," << v.z << "} magnitude =" << v.magnitude;
}
Vector operator*(const Vector& lhs, const Vector& rhs)
{
return Vector(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z);
}
Vector operator+(const Vector& lhs, const Vector& rhs)
{
return Vector(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z);
}
Vector operator-(const Vector& lhs, const Vector& rhs)
{
return Vector(lhs.x + (-rhs.x), lhs.y + (-rhs.y), lhs.z + (-rhs.z));
}
int main()
{
Vector v1(3, 3, 3), v2(2, 2, 2);
Vector v3 = Vector(-1,3,4).getNormalizedVector();
float dotProduct = Vector::getDotProduct(v1, v2);
cout << dotProduct << endl;
return 0;
}
Ultima modifica: