2012-07-25 54 views
4

我经历了gameinsitute的C++程序设计课程,并有运算符重载的例子,我经常得到一个敌不过运营商+错误操作符重载

main.cpp|20|error: no match for ‘operator+’ in ‘v + w’

,我不知道在哪里了问题是。

的main.cpp

// main.cpp 

#include "Vector3.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
    float coords[3] = {1.0f, 2.0f, 3.0f}; 
    Vector3 u; 
    Vector3 v(coords); 
    Vector3 w(-5.0f, 2.0f, 0.0f); 

    cout << "u = "; u.print(); 
    cout << "v = "; v.print(); 
    cout << "w = "; w.print(); 
    cout << endl; 

    u = v + w; // this gives the error 
    cout << "v + w = "; 
    u.print(); 
    cout << endl; 

    v.normalize(); 
    cout << "unit v = "; 
    v.print(); 
    cout << "v.length() = "<< v.length() << endl; 
    cout << endl; 

    float dotP = u * w; // this also gives error 
    cout << "u * w = " << dotP << endl; 

    float* vArray = v.toFloatArray(); 

    cout << 
      "[0] = " << vArray[0] << ", " 
      "[1] = " << vArray[1] << ", " 
      "[2] = " << vArray[2] << endl <<endl; 

    cout << "Input vector..." << endl; 
    Vector3 m; 
    m.input(); 
    cout << "m = "; 
    m.print(); 

    return 0; 
} 

Vector3.h

#ifndef VECTOR3_H 
#define VECTOR3_H 

#include <iostream> 

class Vector3 
{ 
public: 

    // constructors 
    Vector3(); 
    Vector3(float coords[3]); 
    Vector3(float x, float y, float z); 
    Vector3(const Vector3& vec); 

    // methods 
    float length(); 
    void normalize(); 
    float* toFloatArray(); 
    void print(); 
    void input(); 

    // operators 
    Vector3 operator=(const Vector3& rhs); 
    Vector3 operator+(const Vector3& rhs) const; 
    Vector3 operator-(const Vector3& rhs) const; 
    float operator*(const Vector3& rhs) const; 
    Vector3 operator*(float scalar) const; 

    // fields 
    float mX; 
    float mY; 
    float mZ; 
}; 

#endif // VECTOR3_H 

Vector3.cpp

#include "Vector3.h" 
#include <cmath> 
#include <iostream> 

using std::cout; 
using std::cin; 

Vector3::Vector3() 
{ 
    mX = 0.0f; 
    mY = 0.0f; 
    mZ = 0.0f; 
} 

Vector3::Vector3(float coords[3]) 
{ 
    mX = coords[0]; 
    mY = coords[1]; 
    mZ = coords[2]; 
} 

Vector3::Vector3(float x, float y, float z) 
{ 
    mX = x; 
    mY = y; 
    mZ = z; 
} 

Vector3::Vector3(const Vector3& vec) 
{ 
    mX = vec.mX; 
    mY = vec.mY; 
    mZ = vec.mZ; 
} 

float Vector3::length() 
{ 
    return sqrt(mX*mX + mY*mY + mZ*mZ); 
} 

void Vector3::normalize() 
{ 
    float len = length(); 
    mX /= len; 
    mY /= len; 
    mZ /= len; 
} 

float* Vector3::toFloatArray() 
{ 
    return &mX; 
} 

void Vector3::print() 
{ 
    cout << "<" << mX << ", " << mY << ", " << mZ << "> \n"; 
} 

void Vector3::input() 
{ 
    cout << "Enter x: "; 
    cin >> mX; 
    cout << "Enter y: "; 
    cin >> mY; 
    cout << "Enter z: "; 
    cin >> mZ; 
} 

//operators 

Vector3 Vector3::operator=(const Vector3& rhs) 
{ 
    Vector3 vTemp; 
    vTemp.mX = rhs.mX; 
    vTemp.mY = rhs.mY; 
    vTemp.mZ = rhs.mZ; 

    return vTemp; 
} 

Vector3 Vector3::operator+(const Vector3& rhs) const 
{ 
    Vector3 sum; 
    sum.mX = mX + rhs.mX; 
    sum.mY = mY + rhs.mY; 
    sum.mZ = mZ + rhs.mZ; 

    return sum; 
} 

Vector3 Vector3::operator-(const Vector3& rhs) const 
{ 
    Vector3 dif; 
    dif.mX = mX - rhs.mX; 
    dif.mY = mY - rhs.mY; 
    dif.mZ = mZ - rhs.mZ; 

    return dif; 
} 

float Vector3::operator*(const Vector3& rhs) const 
{ 
    float dotP = mX*rhs.mX + mY*rhs.mY + mZ*rhs.mZ; 

    return dotP; 
} 

Vector3 Vector3::operator*(float scalar) const 
{ 
    Vector3 p; 
    p.mX = mX * scalar; 
    p.mY = mY * scalar; 
    p.mZ = mZ * scalar; 

    return p; 
} 

感谢您的帮助提前!

+5

您提供的代码按原样编译。 – 2012-07-25 13:12:41

+2

'operator ='有一个可疑的实现,但不是无效的方式。 – 2012-07-25 13:15:35

+0

你真的确定你发布了正确的错误和正确的相应代码吗?我不知何故怀疑这个错误真的来自'Vector3 v();',在这种情况下'v'就是函数声明。 – 2012-07-25 13:24:37

回答

-1

在旁注中,这些重载有一些问题,您将返回本地引用。我很抱歉,这不是一个答案,我可能会为此付出代价,但仍然是:

以运算符=为例。它应该是

Vector3& Vector3::operator=(const Vector3& rhs) 
{ 
    this->mX = rhs.mX; 
    this->mY = rhs.mY; 
    this->mZ = rhs.mZ; 
    return (*this); 
} 

否则,你正在返回一个本地引用,这将是垃圾,一旦此函数退出。运营商+ - 也是同样的问题。 至于operator *,你正在做一个点乘积,它与矢量乘法不一样。为此,我建议编写()称为点一个函数,它接受的另一种载体,并进行自我和第二矢量之间的点积

另外,您应该使用Eigen library

如果你能向我们提供您怎么编译代码,也许我们可以帮助

+0

运算符不返回引用。 'operator ='具有令人惊讶的行为,但不是无效的代码。 – 2012-07-25 13:57:20

+0

是的,除了他返回的局部变量,它应该在此运算符的范围之外未定义= – 2012-07-25 13:59:27

+0

他是operator =返回局部变量的副本,所以除了令人惊讶的行为之外没有问题。 – 2012-07-25 16:38:32

1

您的operator+没有任何问题 - 这是您的operator=这是错误的,并导致operator+的结果不会做您认为正在做的事情。解决这个问题将解决你的问题。

Vector3 Vector3::operator=(const Vector3& rhs) 
{ 
    mX = rhs.mX; 
    mY = rhs.mY; 
    mZ = rhs.mZ; 
    return *this; 
}