2010-08-24 2 views
-1

Я пытаюсь реализовать программу ближайшей точки. Вот код:Выполнение самой близкой точки

#include <iostream> 
#include <cstdlib> 
#include <math.h> 
using namespace std; 

float randfloat(){ 
    return 1.0*rand()/RAND_MAX; 
} 

class point 
{ 
    public : 
    float x,y; 

    float distance(point& a){ 
     float dx=x-a.x; 
     float dy=y-a.y; 
     return sqrt(dx*dx+dy*dy); 
    } 
}; 

int main(int argc,char* argv[]){ 
    int i,cnt=0; 
    int n=atoi(argv[1]); 
    float d=atof(argv[2]); 
    point *a=new point[n]; 
    for (int i=0;i<n;i++) 
    { 
     a[i].x=randfloat(); 
     a[i].y=randfloat(); 
    } 
    for (i=0;i<n;i++) 
     for (int j=i+1;j<n;j++) 
      if ((distance(a[i],a[j])<d)) cnt++; 
    cout << cnt << "pairs within" << d << endl; 

    return 0; 
} 

Но когда я скомпилировать его из командной строки, он дает ошибку вроде этого:

указатель не является членом точки базового класса

Вот Полный список:

C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C 
2039: 'iterator_category' : is not a member of 'point' 
     closet_point.cpp(9) : see declaration of 'point' 
     closet_point.cpp(37) : see reference to class template instantiation 'st 
d::iterator_traits<_Iter>' being compiled 
     with 
     [ 
      _Iter=point 
     ] 
C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C 
2146: syntax error : missing ';' before identifier 'iterator_category' 
C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C 
4430: missing type specifier - int assumed. Note: C++ does not support default-i 
nt 
C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xutility(373) : error C 
2602: 'std::iterator_traits<_Iter>::iterator_category' is not a member of a base 
class of 'std::iterator_traits<_Iter>' 
     with 
     [ 
      _Iter=point 
     ] 

Как исправить эту проблему?

+1

извините, но вы знаете, что такое шкаф, так? смешно, что у вас даже есть опечатка в файле cpp :) вы можете исправить это. Кроме того, я думаю, что вместо расстояния (a [i], a [j]) это должно быть [i] .distance (a [j]) – humbagumba

ответ

2

Я считаю, что вы используете неправильную функцию distance(). Я считаю, что вы имели в виду

a[i].distance(a[j])

вместо

distance(a[i],a[j])

1

Вы должны вызвать функцию члена в виде

a[i].distance(a[j]) 

Проблема вы видите это, потому что есть встроенная функция, называемая distance(), которая ожидает два итератора. Поскольку point не является итератором, компилятор передает эту ошибку, которая звучит совершенно неуместно.

(кстати, так как .distance() не изменяет аргументы, лучше объявить его как float distance(const point& a) const.)

1

Потому что вы объявили о своей distance как функции члена point, вы должны назвать его

  if ((a[i].distance(a[j])<d)) cnt++; 

В противном случае , он пытается вызвать std::distance, который вызывает сообщения об ошибках.