2

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.

gsamaras
  • 71,951
  • 46
  • 188
  • 305
  • Wild guess but you would get this linker error if you were to compile only main.cc. Have your tried `g++ main.cc gps.cc` – virgesmith Mar 16 '17 at 11:18
  • 1
    also, code formatting counts for a lot on here on SO, increases readability and therefore helps anyone who might answer your question - have done some for you for now :) – Darren Shewry Mar 16 '17 at 11:45

1 Answers1

1

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;
}
Community
  • 1
  • 1
gsamaras
  • 71,951
  • 46
  • 188
  • 305
  • thank you so much one question why some function need to marked as const.? – Mustafa Savran Mar 16 '17 at 12:15
  • Because otherwise you will get the error I mention in my answer. Marking it const says that it won't alter the instance @MustafaSavran. You are welcome. – gsamaras Mar 16 '17 at 12:41