我有两个定义几何实体的类:点和平面。我还想在两点之间定义向量,为此我在 point (punkt)类中创建了减法运算符。以下是此类的代码:
#include <iostream>
#include <vector>
using namespace std;
class Punkt
{
double x, y, z;
public:
Punkt(const double& xp = 1, const double& yp = 1, const double& zp = 1) : x(xp), y(yp), z(zp) {}
vector<double> global;
vector<double>& operator - (const Punkt B) // vector A - B returns vector from point A to B
{
global.push_back(B.x - x);
global.push_back(B.y - y);
global.push_back(B.z - z);
return global;
}
};
适用于main()类。你可以在下面看到我有两个对象:a,b类型punkt,它们被减去并分配给vector wek。它编译没有问题。
#include <iostream>
#include <vector>
#include "punkt.h"
using namespace std;
int main()
{
vector<double> wek;
Punkt a(0, 0, 0);
Punkt b(2, 3, 0);
wek = b - a;
cout << wek[0] << " " << wek[1] << " " << wek[2] << endl;
return 0;
}
但是当我想在 plane 类中使用它时,我得到 IntelliSense:没有运算符&#34; - &#34;匹配这些操作数错误:
#include <iostream>
#include <vector>
#include "punkt.h"
using namespace std;
class Plane
{
Punkt A, B, C;
vector<double> normal;
public:
Plane(const Punkt& A0 = Punkt(),const Punkt& B0 = Punkt(),const Punkt& C0 = Punkt()) : A(A0), B(B0), C(C0)
{
vector<double> wek;
wek = A0 - C0;
}
};
我想问你为什么我可以在这里执行一个操作(main()块),同时我不能在那里(平面类)执行。你也可以帮我修复代码,这样它可以在不重写任何东西的情况下工作吗?我想我问了一个非常基本的问题,希望能加一行或两行代码。提前谢谢!
答案 0 :(得分:1)
它在Plane
中不起作用,因为Punkt
对象是const
而operator-
函数是非const
成员函数。
您应该operator-
成为const
成员函数。
vector<double>& operator - (const Punkt B) const;
//^^^^
在相关的说明中,为什么有
vector<double> global;
作为Punkt
的成员变量?这似乎没必要。您可以使用局部变量实现operator-()
。不仅如此,如果您在同一个对象上调用vector
两次,最终会返回包含6个元素的operator-()
。
将其更改为:
vector<double> operator - (const Punkt B) const
{
vector<double> res;
res.push_back(B.x - x);
res.push_back(B.y - y);
res.push_back(B.z - z);
return res;
}
答案 1 :(得分:0)
当重载运算符时,你应该更喜欢非成员函数到成员函数,如果重载像'减法'这样的运算符,它应该意味着'减去'并且应该返回一个相同类型的对象。在你的情况下,我认为理想的解决方案是创建一个名为像distanceTo(Punkt&amp; p)相关的成员函数,它将返回一个Punkt对象。
您可能想要通过创建一个名为Vector3D的类并使用组合类设计来考虑您的整个代码设计,任何几何形状都包含许多Vector3D对象。一个点有1个,一个平面有4个,依此类推。形状本身负责使用他们的数据。