c++ 构造3D矢量类时出错

sg24os4d  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(186)

我正在调试一个3D矢量代码,但得到以下错误

  1. /usr/bin/g++ -fdiagnostics-color=always -g /home/fangrui/vectorFEM/vectorFEM/main.cpp -o /home/fangrui/vectorFEM/vectorFEM/main
  2. In file included from /home/fangrui/vectorFEM/vectorFEM/constant.h:6:0,
  3. from /home/fangrui/vectorFEM/vectorFEM/mesh.h:2,
  4. from /home/fangrui/vectorFEM/vectorFEM/edgenedelec.h:2,
  5. from /home/fangrui/vectorFEM/vectorFEM/main.cpp:1:
  6. /home/fangrui/vectorFEM/vectorFEM/cvector3D.h: In function cvector operator*(double, cvector)’:
  7. /home/fangrui/vectorFEM/vectorFEM/cvector3D.h:39:10: error: cannot bind non-const lvalue reference of type cvector&’ to an rvalue of type cvector
  8. return cvector(x1*x2.x, x1*x2.y, x1*x2.z);
  9. ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  10. ...

这是cvector3D.h文件中的一个问题,但我不明白这个错误以及应该进行什么样的更改。除了上面的错误,还有一个关于friend的警告:

  1. class "cvector" has no suitable copy constructorC/C++(334)

下面是cvector3D.h的原始代码

  1. # ifndef CVECTOR3D_H
  2. # define CVECTOR3D_H
  3. #include<cmath>
  4. #include<ostream>
  5. #include<iomanip>
  6. using namespace std;
  7. /*A three-dimensional real vector class is defined to facilitate numerical calculations*/
  8. class cvector
  9. {
  10. public:
  11. double x, y, z;
  12. //Construct function
  13. cvector(double _x, double _y, double _z){ x = _x; y = _y; z = _z; }
  14. //Copy the constructor
  15. cvector(cvector &pt){ x = pt.x; y = pt.y; z = pt.z; }
  16. cvector(){ x = 0; y = 0; z = 0; }
  17. ~cvector(){};
  18. //Operator overloading
  19. cvector operator +();
  20. cvector operator -(); //The vector is negated
  21. friend ostream &operator<<(ostream &os, const cvector &x1);
  22. cvector operator +(cvector x1);
  23. cvector operator -(cvector x1);
  24. cvector operator *(double x1);
  25. cvector operator /(double x1);
  26. cvector &operator =(cvector x1);
  27. cvector &operator +=(cvector x1);
  28. cvector &operator -=(cvector x1);
  29. cvector &operator *=(double x1);
  30. cvector &operator /=(double x1);
  31. int operator ==(cvector x1);
  32. int operator !=(cvector x1);
  33. friend cvector operator *(double x1, cvector x2) {
  34. return cvector(x1*x2.x, x1*x2.y, x1*x2.z);
  35. }
  36. //Member functions
  37. double dist(cvector x1);
  38. cvector unit();
  39. double norm();
  40. friend cvector cross(cvector x1, cvector x2)
  41. {
  42. return cvector(x1.y*x2.z - x1.z*x2.y, x1.z*x2.x - x1.x*x2.z, x1.x*x2.y - x1.y*x2.x);
  43. }
  44. friend double dot(cvector x1, cvector x2)
  45. {
  46. return (x1.x*x2.x + x1.y*x2.y + x1.z*x2.z);
  47. }
  48. } ;
  49. # endif
zkure5ic

zkure5ic1#

    • cvector复制构造函数格式错误**

正确的形式是cvector(const cvector& cvec)

    • 详细说明:**

当好友功能

  1. friend cvector operator *(double x1, cvector x2) {
  2. return cvector(x1*x2.x, x1*x2.y, x1*x2.z);
  3. }

被称为cvector的构造函数。在构造对象被copy返回后立即调用复制构造函数,但是刚刚创建的cvector&类型的左值,即non-const不能转换为cvector类型的右值。
这是因为非常量引用参数,例如int&,只能引用“lvalue”,这是一个命名变量。
在这种情况下,创建的对象不是命名变量。

相关问题