C++ 错误:'double'之前的预期主表达式

C++ Error: expected primary-expression before 'double'

本文关键字:表达式 double 错误 C++      更新时间:2023-10-16

我需要编写一个计算两点之间距离的类程序-Point.cpp,以及另一个调用我的Point.cpp程序来计算两点之间的长度(基本上是与Point.cpp的距离)和斜率的类程序-LineSegment.cpp。我分别测试了我的Point.chpp,它运行良好。但是,当我一起运行所有内容(与LineSegment.cpp一起运行)时,我会得到以下错误消息:

LineSegment.cpp: In member function ‘void LineSegment::setEnd1(Point)’:
LineSegment.cpp:31: error: expected primary-expression before ‘double’
LineSegment.cpp:32: error: expected primary-expression before ‘double’
LineSegment.cpp: In member function ‘void LineSegment::setEnd2(Point)’:
LineSegment.cpp:37: error: expected primary-expression before ‘double’
LineSegment.cpp:38: error: expected primary-expression before ‘double’

我的代码如下。我已经用注释标记了错误消息所指的4行(每次我用行号发布代码时,我都会收到一个删除行号的建议编辑,所以这次我没有包括行号)。

我的猜测是,我错误地调用了Point.cpp中的函数,但我的教科书没有告诉我如何从嵌套类中调用函数。如有任何指导,我们将不胜感激感谢大家抽出时间

线段.hpp

#ifndef LINESEGMENT_HPP
#define LINESEGMENT_HPP
#include "Point.hpp"
class LineSegment {
private:
   Point p1;
   Point p2;
public:
   LineSegment(Point, Point);
   void setEnd1(Point p1);
   void setEnd2(Point p2);
   Point getEnd1();
   Point getEnd2();
   double length();
   double slope();
};
#endif

LineSegment.cpp

#include <iostream>
#include <cmath>
#include "LineSegment.hpp"
//constructor
LineSegment::LineSegment(Point p1, Point p2) {
   setEnd1(p1);
   setEnd2(p2);
}
//set and get points
void LineSegment::setEnd1(Point p1) {
   p1.setXCoord(double);       // <-- error
   p1.setYCoord(double);       // <-- error
   setEnd1(p1);
}
void LineSegment::setEnd2(Point p2) {
   p2.setXCoord(double);       // <-- error
   p2.setYCoord(double);       // <-- error
   setEnd2(p2);
}
Point LineSegment::getEnd1() {
   return p1;
}
Point LineSegment::getEnd2() {
   return p2;
}
//calculations
double LineSegment::length() {
   return p1.distanceTo(p2);
}
double LineSegment::slope() {
   return(p2.getYCoord()-p1.getYCoord())/p2.getXCoord()-p1.getXCoord();
}

Point.hpp

#ifndef POINT_HPP
#define POINT_HPP
class Point {
private:
   double xCoord;
   double yCoord;
public:
   Point();
   Point(double x1, double y1);
   void setXCoord(double x1);
   void setYCoord(double y1);
   double getXCoord();
   double getYCoord();
   double distanceTo(const Point&);
};
#endif

Point.cpp

#include <cmath>
#include <iostream>
#include "Point.hpp"
//default constructor
Point::Point() {
   xCoord = 0.0;
   yCoord = 0.0;
}
//constructor
Point::Point(double x, double y) {
   xCoord = x;
   yCoord = y;
}
//get and set functions
void Point::setXCoord(double x) {
   xCoord = x;
}
void Point::setYCoord(double y) {
  yCoord = y;
}
double Point::getXCoord() {
   return xCoord;
}
double Point::getYCoord() {
   return yCoord;
}
// calculate distance
double Point::distanceTo(const Point& p2) {
  double dx = p2.xCoord - xCoord;
  double dy = p2.yCoord - yCoord;
  return sqrt(dx * dx + dy * dy);
}

double是一个类型说明符,而不是对象。例如,为什么setEnd1会自称?

你的意思似乎是下面的

//set and get points
void LineSegment::setEnd1(Point p1) {
   this->p1.setXCoord(p1.getXCoord());       // <-- error
   this->p1.setYCoord(pq.getYCoord());       // <-- error
}
void LineSegment::setEnd2(Point p2) {
   this->p2.setXCoord(p2.getXCoord());       // <-- error
   this->p2.setYCoord(p2.getXCoord());       // <-- error
}

你可以写更简单的

//set and get points
void LineSegment::setEnd1(Point p1) {
   this->p1 = p1;
}
void LineSegment::setEnd2(Point p2) {
   this->p2 = p2;
}

至少在Point类中,所有这些成员函数都应该用限定符const 声明

double getXCoord() const;
double getYCoord() const;
double distanceTo(const Point&) const;
p2.setXCoord(double);       // <-- error
p2.setYCoord(double);       // <-- error

double是一个类型,而不是有效的实际参数名称。

使用double或至少可转换为double的值或变量调用这些函数。

double是double类型的保留关键字,它不能作为参数传递给函数,您需要转发Point类型的实际值。

void LineSegment::setEnd1(Point p1) {
   p1.setXCoord(p1.getXCoord());   
   p1.setYCoord(p1.getYCoord());   
}
void LineSegment::setEnd1(Point p1) {
   p1.setXCoord(double);       // <-- error
   p1.setYCoord(double);       // <-- error
   setEnd1(p1);
}

LineSegment的集合函数每个都接受类Point的一个参数。所以当你给它一个Point类型的变量时,你必须把它保存为Point。

void Point::setXCoord(double x) {
   xCoord = x;
}

这段代码是你想要做的事情的模板。你不需要键入double,而是需要为p1和任何目的地的名称键入Point。