初学者遭遇离奇错误——求两点间的距离(C++)

  有学生向我求助,他编了一个程序,设计一个“点”类,求出两点距离的程序。程序看着没有问题,却出了一大堆的错误。程序如下:

#include <iostream>
#include <math.h>
using namespace std;
class point
{
public:
	double x;
	double y;
};
double distance(point p1,point p2);

int main()
{
	point p1= {3,5},p2= {6,9};
	cout<<distance(p1,p2);
}

double distance(point p1,point p2)
{
	double d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
	return d;
}

  在codeBlocks下编译,错误直接引到stl_iterator_base_types.h文件中,错误一大堆:

||=== example, Debug ===|
D:\C++\codeBlock\example\example.cpp|15|instantiated from here|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|127|error: no type named 'iterator_category' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|128|error: no type named 'value_type' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|129|error: no type named 'difference_type' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|130|error: no type named 'pointer' in 'class point'|
d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_iterator_base_types.h|131|error: no type named 'reference' in 'class point'|
||=== Build finished: 5 errors, 0 warnings ===|

  对于这样的问题,初学C++的同学肯定直接蒙。这里的问题出在命名空间中名字的冲突,再多说一些,与STL也有些关系。不过,解决这样的问题并不一定得知道这么多。我还是试着与大家绕开这个环节,从其他途径找点感觉。

  光标置到“D:\C++\codeBlock\example\example.cpp|15|instantiated from here|”一行,双击,发现错误在程序的第15行。鼠标放到15行的distance函数上时,浮现出了一行提示,见图:

  看出了一点疑惑:distance不是在这个程序中编的自定义函数吗?怎么识别成了std::distance(...,...)?

  这就是问题的根源!编译器没有将distance当作自定义函数处理!至于进一步的解释不再深入,抓住这个要点,程序就可以改好了。

  修改方法之一:既然函数名字上出问题,试试改个名字?将distance改个名字,如dist,一切正常。

  修改方法之二:凭什么让我改?distance多好的一个函数名(不过提醒,可以自学一下命名空间了,此是好机会,不必等着老师讲。)需要做的工作是,不用std命名空间(删除或注释掉using namespace std;一行)然后在依赖std的cout前加上std::,程序如下:

#include <iostream>
#include <math.h>
//using namespace std;//不再用命名空间std
class point
{
public:
	double x;
	double y;
};
double distance(point p1,point p2);

int main()
{
	point p1= {3,5},p2= {6,9};
	std::cout<<distance(p1,p2);  //保证编译系统知道用std命名空间中的cout
}

double distance(point p1,point p2)
{
	double d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
	return d;
}

  修改方法之三:方法二有点自私了。std中有不少常用的东东,就此全都得写std::,这个程序中无妨,如果再大些的程序呢?胳膊不必和大腿拧,换种思路,也是一样。将distance在调用时,写作为::distance,指出distance是当前程序中定义的名字。问题解决就此解决,程序如下:

#include <iostream>
#include <math.h>
using namespace std;
class point
{
public:
	double x;
	double y;
};
double distance(point p1,point p2);

int main()
{
	point p1= {3,5},p2= {6,9};
	cout<<::distance(p1,p2);//指定distance不是别处的,就是本文件中定义的
}

double distance(point p1,point p2)
{
	double d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
	return d;
}

  修改方法之四:前三种方法中,个人倾向于第一种,山不转水转,换个名字也妨。其实这也不是最好的。原始的程序中定义了类,但只有数据成员,没有成员函数,像求距离之类的,设计为成员函数多好。面向对象的机制就是为了信息封装等特性的,为何要如此浪费?这个程序我就不写了,请自行解决。

  补充:用其他编程环境时,观察和修改的方法也类似,例如在VS2008下编译,错误居然有25个之多:

1>------ 已启动生成: 项目: example, 配置: Debug Win32 ------
1>正在编译...
1>example.cpp
1>d:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2039: “iterator_category”: 不是“point”的成员
1>        d:\c++\vs2008 project\example\example\example.cpp(5) : 参见“point”的声明
1>        d:\c++\vs2008 project\example\example\example.cpp(16): 参见对正在编译的类 模板 实例化“std::iterator_traits<_Iter>”的引用
1>        with
1>        [
1>            _Iter=point
1>        ]
(此处省略N多的提示)

1>生成日志保存在“file://d:\C++\VS2008 project\example\example\Debug\BuildLog.htm”
1>example - 25 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

  在源程序中,鼠标光临distance函数时,可以看出编译器对distance函数有两种解释,如下图:

  编译器对此局面真的很迷茫了。余下的修改思路相同,不再罗嗦。

时间: 2024-10-06 04:28:47

初学者遭遇离奇错误——求两点间的距离(C++)的相关文章

最短路径条数-spark graphx框架下怎样求两点间最短路径的条数

问题描述 spark graphx框架下怎样求两点间最短路径的条数 我使用spark的graphx图计算框架,现在要求一个图中所有节点对的最短路径条数, graphx下的pregel迭代貌似使用的是类迪杰斯特拉算法,要求最短路径长度很容易, 但是要求条数,我实在是想不出来怎么求,希望各位大神解答,最好能有源码,实在 没有,有思路也可以,万分感谢!!!

c++ 课设 c++编程问题-C++编程题 用类做两个坐标,求两点之间的距离

问题描述 C++编程题 用类做两个坐标,求两点之间的距离 用类做两个坐标,求两点之间距离 C++编程题明天上课就要交了,不交就得挂科,求尽快给以正解,在下感激不进 解决方案 http://codepad.org/zqnz4GTt #include <math.h> #include <iostream.h> using namespace std; class Point { public: int x; public: int y; public: double distance

flex中Away3D计算两点间的距离、两点间的中点例子

在Away3D开发中,有时需要计算两个点(Vector3D )之间的距离或者中点.假设有如下v1.v2两个坐标点. 1,两点间的距离(线段长度) var v1:Vector3D = new Vector3D(0,0,0); var v2:Vector3D = new Vector3D(200,200,200); var lenght:Number =  v1.subtract(v2).length;  //346.41016151377545 2,两点间的中点(线段中点) var v1:Vect

HDOJ 2001 计算两点间的距离

Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开. Output 对于每组输入数据,输出一行,结果保留两位小数. Sample Input 0 0 0 1 0 1 1 0 Sample Output 1.00 1.41 import java.util.*; class Main{ public static void main(

栅格数据求两点间最小距离

问题描述 ArcGIS使用的是栅格数据,请问他们是如何在栅格数据上计算两个点间的最小费用距离.现在的成熟算法有哪些?求连接啊. 解决方案 解决方案二: 解决方案三:不是要球面的,主要还是搜索算法解决方案四:两个点间的最小费用距离?最小费用距离是最短距离吗?解决方案五:可以理解做是吧解决方案六:两点间的线段长度就是你要的结果

请牛人指点,如何以最优的算法,对两点间的距离进行排序。

问题描述 业务要求:根据APP当前位置,取得距离最近的10条记录,再次刷新时,取得后10条最近的数据...我考虑的思路:■思路1:查询出数据库中所有的数据,根据两点的经度和纬度计算得到距离.再按照距离排序.缺点是,如果数据库有100万条数据,每次取出来,效率会很慢.■思路2:SQL查询语句中,取得两点间,经度和纬度差值的绝对值,以从小到大排序,取得前10条即可.这样查出来的数据量就比较小了.正确的思路到底是什么呢,不知道别人的APP距离排序怎么个算法.★Java算法是什么呢??★APP客户端传递

HDOJ/HDU 2547 无剑无我(两点间的距离)

Problem Description 北宋末年,奸臣当道,宦官掌权,外侮日亟,辽军再犯.时下战火连连,烽烟四起,哀鸿遍野,民不聊生,又有众多能人异士群起而反,天下志士云集响应,景粮影从. 值此危急存亡之秋,在一个与世隔绝的地方-MCA山上一位江湖人称<英雄哪里出来>的人正在为抗击辽贼研究剑法,终于于一雷电交加之夜精确计算出了荡剑回锋的剑气伤害公式. 定义 f(x, y, m, n) = sqrt(x*x + y*y + m*m + n*n - 2*m*x - 2*n*y); hint : s

Openlayers3 计算地图上任意两点间的距离

对应的openlayers的版本为3.7. 主要用的接口是ol.Sphere.haversineDistance([x1,y1],[x2,y2]): 4326坐标系中计算两点距离的方式为: var wgs84Sphere = new ol.Sphere(6378137); wgs84Sphere.haversineDistance(C1,C2); 示例为: var wgs84Sphere = new ol.Sphere(6378137); wgs84Sphere.haversineDistanc

根据经纬度计算地球上两点之间的距离js实现代码_javascript技巧

利用JS实现的根据经纬度计算地球上两点之间的距离 最近用到了根据经纬度计算地球表面两点间距离的公式,然后就用JS实现了一下. 计算地球表面两点间的距离大概有两种办法. 第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距离(The Great Circle Distance). 公式如下: 使用JS来实现为: 复制代码 代码如下: var EARTH_RADIUS = 6378137.0; //单位M var PI = Math.PI; function getRad(