main.cc
#include <iostream>
#include <cstdlib>
#include <string>
#include "gps.h"
using namespace std;
int main(int argc, char *argv[])
{
GPScoord gps1(12.0,13.0);
GPScoord gps2(12.0,13.0);
cout<<gps1.distance_to(gps2)<<endl;
return 0;
}
gps.h
#ifndef GPS_H
#define GPS_H
class GPScoord {
public:
GPScoord(double lat, double longt);
double lattitude1();
double longtitude1();
double rad_lat();
double rad_long();
double distance_to(const GPScoord& gps );
private:
double lattitude;
double longtitude;
};
#endif
gps.cc
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <math.h>
#include "gps.h"
using namespace std;
class GPScoord
{
private:
double lattitude;
double longtitude;
public:
GPScoord(double lat,double longt) {
lattitude=lat;
longtitude=longt;
}
public:
double lattitude1(){ return lattitude; }
double longtitude1(){ return longtitude; }
double rad_lat(){ return lattitude*M_PI/180; }
double rad_long(){ return longtitude*M_PI/180; }
double distance_to(const GPScoord& gps ){
double R = 6371e3;
double radlat = rad_lat();
double ralong = rad_long();
double radlat1 = gps.rad_lat();
double radlong1 = gps.rad_long();
double radlat2 = radlat-radlat1;
double radlong2 = ralong-radlong1;
double a = pow((sin(radlat2/2)),2)+cos(radlat)*
cos(radlat1)*pow((sin(radlong2)),2);
double c=2*atan2(sqrt(a),sqrt(1-a));
return R*c;
}
};
I get the following error:
/tmp/cc13HrVO.o: In function `main':
/home/mustafa/Desktop/main.cc:14: undefined reference to `GPScoord::GPScoord(double, double)'
/home/mustafa/Desktop/main.cc:15: undefined reference to `GPScoord::GPScoord(double, double)'
/home/mustafa/Desktop/main.cc:17: undefined reference to `GPScoord::distance_to(GPScoord const&)'
collect2: error: ld returned 1 exit status
I did't understand this error, 12.0 is not double or gps2 is not class? I think this problem is in the gps.h but I didn't find this error.
First, you need to compile both the source files, like this:
g++ -Wall main.cc gps.cc
Then you will see that you receive an error of redefining your class, which as explained here can be fixed by defining the class in the header file and then implement the methods of your class to the source file, without having to redefine the class.
After that you will get errors like this:
gps.cc:21:19: error: member function 'rad_lat' not viable: 'this' argument has
type 'const GPScoord', but function is not marked const
double radlat = rad_lat();
^~~~~~~
which happen, just as the compiler says, because some functions need to be marked as const. Putting them all together you will get something like the code below:
gps.h:
#ifndef GPS_H
#define GPS_H
class GPScoord {
public:
GPScoord(double lat, double longt);
double lattitude1();
double longtitude1();
double rad_lat() const;
double rad_long() const;
double distance_to(const GPScoord& gps ) const;
private:
double lattitude;
double longtitude;
};
#endif
gps.cc:
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <math.h>
#include "gps.h"
using namespace std;
GPScoord::GPScoord(double lat,double longt) {
lattitude=lat;
longtitude=longt;
}
double GPScoord::lattitude1(){ return lattitude; }
double GPScoord::longtitude1(){ return longtitude; }
double GPScoord::rad_lat() const { return lattitude*M_PI/180; }
double GPScoord::rad_long() const { return longtitude*M_PI/180; }
double GPScoord::distance_to(const GPScoord& gps ) const {
double R = 6371e3;
double radlat = rad_lat();
double ralong = rad_long();
double radlat1 = gps.rad_lat();
double radlong1 = gps.rad_long();
double radlat2 = radlat-radlat1;
double radlong2 = ralong-radlong1;
double a = pow((sin(radlat2/2)),2)+cos(radlat)*
cos(radlat1)*pow((sin(radlong2)),2);
double c=2*atan2(sqrt(a),sqrt(1-a));
return R*c;
}