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”来自哪里......使用指针时是否存在另一种重载方式?
答案 0 :(得分:0)
错误是因为您要分配指向Vect的指针的差异,该指针应该对象类型为vect的实例。所以他们是无法比拟的。除此之外,我认为两点指向非线性记忆的区别是不合理的。
答案 1 :(得分:0)
v2
和v1
是指针,两个指针之间的差异是一个数字,告诉你两个地址之间的偏移量,这是一个数字。
你不想使用指针超载"#34;你希望operator-
的结果指向对象,而不是指针本身。
您需要说*v2 - *v1
取消引用指针并访问它们指向的对象。
答案 2 :(得分:0)
而不是
vect dir = v2 - v1;
你应该写
vect dir = *v2 - *v1;
这是因为v2
和v1
是向量的指针,在指针上应用运算符-
会减去它们的地址(确切地说,它减去它们的地址除以类型的大小,因此你得到了两个元素之间的内存中的偏移数;对于原始数组索引很有用。
通过在指针前放一个星号,你解除引用它,这意味着你现在处理指针后面的值而不是指针本身。
当您想通过引用函数来避免复制对象或传递对象时,更好的解决方案是使用 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));
}
这里可能有一些不必要的括号,但我认为这总是比反直觉的操作顺序更好地搞砸你的代码。