免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7861 | 回复: 15
打印 上一主题 下一主题

[C++] 目的:用类去求任两点间的距离,代码问题何在? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 23:12 |只看该作者 |倒序浏览
5可用积分
#include<iostream>
#include<cmath>
using namespace std;
class Point
{
       public:
              Point(float x,float y){X=x;Y=y;}
              float getX(){return X;}
              float getY(){return Y;}
              friend float distance(Point& a,Point& b);
              private:
                     float X,Y;
                      };
                     float distance(Point& a,Point& b)
                      {
                      float xx=a.X-b.X;
                      float yy=a.Y-b.Y;
                      return sqrt(xx*xx+yy*yy);
                      }
                     int main()
                      {
                           float m1,m2,n1,n2;
                           cout<<"请输入其中一点的坐标:"<<"(";
                           cin>>m1>>m2;
                            cout<<")"<<endl;
                           cout<<"请输入另一点的坐标:"<<"(";
                           cin>>n1>>n2;
                           cout<<")"<<endl;
                           Point myp1(m1,m2), myp2(n1,n2);
                           cout<<"the distance is:";
                           cout<<distance(myp1,myp2)<<endl;
                           system("pause");
                           }

最佳答案

查看完整内容

出错原因:你自己定义的::distance函数与标准库定义的std::distance模板函数冲突了。在调用distance(myp1,myp2)时,这两个distance函数都可见,编译器会去推断std::ditance的模板参数(为Point),并试图实例化该函数模板,却发现模板参数Point内并没有想要的迭代器所必须具有的5个内嵌public类型(iterator_category等),从而实例化失败,编译器报错纠正方法:(1)对自己定义的distance改名,避免与标准库版本冲突(2)对自己定 ...

论坛徽章:
0
2 [报告]
发表于 2009-02-27 23:12 |只看该作者
出错原因:
你自己定义的::distance函数与标准库定义的std::distance模板函数冲突了。在调用distance(myp1,myp2)时,这两个distance函数都可见,编译器会去推断std::ditance的模板参数(为Point),并试图实例化该函数模板,却发现模板参数Point内并没有想要的迭代器所必须具有的5个内嵌public类型(iterator_category等),从而实例化失败,编译器报错

纠正方法:
(1)对自己定义的distance改名,避免与标准库版本冲突
(2)对自己定义的distance用限定符访问,即调用改为::distance(myp1,myp2)

论坛徽章:
0
3 [报告]
发表于 2009-02-27 23:21 |只看该作者
代码用 <code></code>括起来吧,否则看起来眼花缭乱

论坛徽章:
0
4 [报告]
发表于 2009-02-27 23:28 |只看该作者
我在vc下编译通过,运行也没问题啊
楼主为何觉得代码有问题

论坛徽章:
0
5 [报告]
发表于 2009-02-28 10:59 |只看该作者
原帖由 zhuhefang2006 于 2009-2-27 23:28 发表
我在vc下编译通过,运行也没问题啊
楼主为何觉得代码有问题


我用的是DEV-C++5(4.9.9.2),真的不能通过的哦!难道不同的编译器是原因所在?我认为这可能性不大.......所以还请各位大侠不吝赐教。

论坛徽章:
0
6 [报告]
发表于 2009-02-28 11:06 |只看该作者
你太可爱了,连不通过报的什么错都不贴出来,叫别人怎么帮你解决。

论坛徽章:
0
7 [报告]
发表于 2009-02-28 11:12 |只看该作者
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
using std::endl;
class Point
{
public:
    oint(float x = 0.0 ,float y = 0.0 ){X=x;Y=y;}
    float getX(){return X;}
    float getY(){return Y;}
    float getX() const {return X;}
    float getY() const {return Y;}
    //friend float distance(const Point& a,const Point& b);

private:
    float X,Y;
};

float distance(const Point& a,const Point& b)
{
    float xx=a.getX()-b.getX();
    float yy=a.getY()-b.getY();
    return sqrt(xx*xx+yy*yy);
}

int main()
{
    float m1,m2,n1,n2;
    cout<<"请输入其中一点的坐标:"<<"(";
    cin>>m1>>m2;
    cout<<""<<endl;
    cout<<"请输入另一点的坐标:"<<"(";
    cin>>n1>>n2;
    cout<<""<<endl;
    Point myp1(m1,m2), myp2(n1,n2);
    cout<<"the distance is:";
    cout<<distance(myp1,myp2)<<endl;
    return 0;
    //system("pause";

}

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2009-02-28 11:45 |只看该作者

  1. #include<iostream>
  2. #include<cmath>
  3. //using namespace std;
  4. class Point
  5. {
  6.        public:
  7.               Point(float x,float y){X=x;Y=y;}
  8.               float getX(){return X;}
  9.               float getY(){return Y;}
  10.               friend float distance(Point& a,Point& b);
  11.               private:
  12.                      float X,Y;
  13.                       };
  14.                      float distance(Point& a,Point& b)
  15.                       {
  16.                       float xx=a.X-b.X;
  17.                       float yy=a.Y-b.Y;
  18.                       return sqrt(xx*xx+yy*yy);
  19.                       }
  20. using namespace std;
  21.                      int main()
  22.                       {
  23.                            float m1,m2,n1,n2;
  24.                            cout<<"请输入其中一点的坐标:"<<"(";
  25.                            cin>>m1>>m2;
  26.                             cout<<")"<<endl;
  27.                            cout<<"请输入另一点的坐标:"<<"(";
  28.                            cin>>n1>>n2;
  29.                            cout<<")"<<endl;
  30.                            Point myp1(m1,m2), myp2(n1,n2);
  31.                            cout<<"the distance is:";
  32.                            cout<<distance(myp1,myp2)<<endl;
  33.                            system("pause");
  34.                            }
复制代码

论坛徽章:
0
9 [报告]
发表于 2009-02-28 11:45 |只看该作者
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

typedef struct TwoDimensionalPoint_st {double x; double y;} Point;

static class TwoDimensionalDistance
{
public:
        double operator() (Point op1, Point op2)
        {
                double xdiff = op2.x - op1.x;
                double ydiff = op2.y - op1.y;
                return sqrt(xdiff*xdiff + ydiff*ydiff);
        }
} Distance;

int
main(void)
{
        Point A = {3.0, 3.0};
        Point B = {4.0, 4.0};
        cout << setprecision(10) << Distance(A, B) << endl;
        return 0;
}


这个行不?



[ 本帖最后由 langue 于 2009-2-28 11:50 编辑 ]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
10 [报告]
发表于 2009-02-28 11:48 |只看该作者

  1. #include <iostream>
  2. #include <cmath>

  3. class Point {
  4. public:
  5.         Point(double px = 0, double py = 0)
  6.         {
  7.                 x = px;
  8.                 y = py;
  9.         }
  10.         double GetX()
  11.         {
  12.                 return x;
  13.         }
  14.         double GetY()
  15.         {
  16.                 return y;
  17.         }
  18.         double operator -(const Point &t) const
  19.         {
  20.                 double ax, ay;

  21.                 ax = x - t.x;
  22.                 ay = y - t.y;
  23.                 return sqrt(ax * ax + ay * ay);
  24.         }

  25. private:
  26.         double x, y;
  27. };

  28. int main(void)
  29. {
  30.         Point a(1,2), b(5,6);

  31.         std::cout << a - b << std::endl;
  32.         return 0;
  33. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP