定义的运算符在main()中工作但不在课堂上工作

时间:2014-12-30 23:09:38

标签: c++ operators

我有两个定义几何实体的类:点和平面。我还想在两点之间定义向量,为此我在 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()块),同时我不能在那里(平面类)执行。你也可以帮我修复代码,这样它可以在不重写任何东西的情况下工作吗?我想我问了一个非常基本的问题,希望能加一行或两行代码。提前谢谢!

2 个答案:

答案 0 :(得分:1)

它在Plane中不起作用,因为Punkt对象是constoperator-函数是非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个,依此类推。形状本身负责使用他们的数据。

相关问题