0
struct vect{
    float x,y,z;
    vect(float xx, float yy, float zz){
        x=xx;
        y=yy;
        z=zz;
    }
    vect(){
        x=0;
        y=0;
        z=0;
    }
    void normalize(){
        float len = sqrt(x*x + y*y + z*z);
        x = x/len;
        y = y/len;
        z = z/len;
    }
    vect operator-(const vect &other) const{return vect(x-other.x,y-other.y,z-other.z);}
};

bool tri_plane_x(vect *v1, vect *v2, vect *v3, vect *pos, float s){

    //removed unnessecary code

    if (vv1 != vv2){
        vect dir = v2 - v1; // getting an error on this line
        dir.normalize();
        float d = (pos->x - v1->x)/dir.x;
        hy[c] = d * dir.y + v1->y;
        hz[c] = d * dir.z + v1->z;
        c++;
    }

    //removed unnessecary code
}

有人知道为什么这不会编译吗?我如何重载函数是否有错误,或者这是因为我减去了两个指向 vect 的指针?

./exporter/main.cpp:74:19: error: conversion from ‘long int’ to non-scalar type ‘vect’ requested

这是与此行相关的编译器错误。(不包括整个日志,因为它只是代码中重复多次的相同错误)

我看不到“long int”的来源......使用指针时是否有另一种重载方式?

4

4 回答 4

0

该错误是因为您正在分配指向 Vect 的指针差异,该指针应该对象类型为 vect 的实例。所以他们是不可比的。除此之外,我认为指向非线性内存的两个指针的区别没有意义。

于 2013-01-19T21:08:56.400 回答
0

v2v1是指针,两个指针之间的区别是一个数字,告诉你两个地址之间的偏移量,它是一个数字。

你不想“使用指针重载”你想要指向operator-的对象的结果,而不是指针本身。

您需要说*v2 - *v1取消引用指针并访问它们指向的对象。

于 2013-01-19T21:09:25.430 回答
0

代替

    vect dir = v2 - v1;

你应该写

    vect dir = *v2 - *v1;

这是因为v2andv1是指向向量的指针,并且在指针上应用运算符-​​减去它们的地址(准确地说,它减去它们的地址除以类型的大小,所以你得到的内存中的偏移量介于两个元素;很高兴知道原始数组索引)。

通过在指针前面放一个星号,您正在取消引用它,这意味着您现在正在处理指针后面的值而不是指针本身

当您想避免复制对象或通过引用传递对象到函数时,更好的解决方案是使用引用而不是指针。这既避免了这种情况,又简化了语法:

bool tri_plane_x(vect &v1, vect &v2, vect &v3, vect &pos, float s) {
    if (vv1 != vv2) {
        vect dir = v2 - v1;
        dir.normalize();
        // ...
    }
}
于 2013-01-19T21:09:33.057 回答
0

您的operator -声明需要一个 vect引用,但您已经传递了一个 vect指针。引用和指针可以产生类似的行为,但它们不是一回事。

有关它们之间的差异的更多说明,请参阅这篇文章

基本上,您试图调用operator -一对指向 vects 的指针,而不是 vects 本身。为了解决这个问题,您可以使用 deferences 运算符 (*) 来访问指针指向的 vect 对象:

vect dir = (*v2) - (*v1);

或者通过将您的论点声明为引用:

bool tri_plane_x(const vect& v1, const vect& v2, const vect& v3, const vect& pos, 
float s){
  ...

或者您也可以重载您operator-以接受指向 vects 的指针:

vect operator-(const vect* other) const
{
     return vect(x-(other->x),y-(other->y),z-(other->z));
}

这里可能有一些不必要的括号,但我认为这总是比违反直觉的操作顺序搞砸你的代码要好。

于 2013-01-19T21:14:37.960 回答