重载和使用指针时出现编译器错误

时间:2013-01-19 21:06:09

标签: c++ pointers operator-overloading

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 个答案:

答案 0 :(得分:0)

错误是因为您要分配指向Vect的指针的差异,该指针应该对象类型为vect的实例。所以他们是无法比拟的。除此之外,我认为两点指向非线性记忆的区别是不合理的。

答案 1 :(得分:0)

v2v1是指针,两个指针之间的差异是一个数字,告诉你两个地址之间的偏移量,这是一个数字。

你不想使用指针超载"#34;你希望operator-的结果指向对象,而不是指针本身。

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

答案 2 :(得分:0)

而不是

    vect dir = v2 - v1;

你应该写

    vect dir = *v2 - *v1;

这是因为v2v1是向量的指针,在指针上应用运算符-会减去它们的地址(确切地说,它减去它们的地址除以类型的大小,因此你得到了两个元素之间的内存中的偏移数;对于原始数组索引很有用。

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

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

bool tri_plane_x(vect &v1, vect &v2, vect &v3, vect &pos, float s) {
    if (vv1 != vv2) {
        vect dir = v2 - v1;
        dir.normalize();
        // ...
    }
}

答案 3 :(得分:0)

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

有关其差异的更多说明,请参阅this post

基本上你试图在一对指针上调用operator -,而不是vect本身。要解决这个问题,你可以使用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-重载以接受指向vect的指针:

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

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