2

So far I've managed to fix my own errors, but this one is keeping me puzzled for a while now. If any of you have any hints, that would be greately appreciated! Thanks.

I'm using Eclipse on a Windows laptop, which gives me the following error after building: undefined reference to `Point::Point()' circle.cpp /Assignment4_1/IN4084MSc line 13 C/C++ Problem

All my files (main4_1.cpp, point.h, point.cpp, circle.h, circle.cpp) are part of a project (called Assignment4_1).

#include "point.h"
#include "circle.h"
#include <cmath>
using namespace std;

Circle::Circle(Point ct, double rd):Point(ct)
{
    center = ct;
    if(rd > 0)
        {
        radius = rd;
        }
    radius = -1;
}

Point Circle::get_center(){
    return center;
}

double Circle::get_radius(){
    return radius;
}

void Circle::print(){
    cout << " <Circle(<Point(“"<<center.get_x()<<"”,“"<<center.get_y()<<"”)>,”"<<radius<<"”)>";
}

void Circle::print(string s){
    cout << s;
    print();
}

void Circle::println(){
    print();
    cout << endl;
}

void Circle::println(string s){
    print(s);
    cout << endl;
}




#ifndef CIRCLE_H_
#define CIRCLE_H_

#include <iostream>
#include "point.h"

using namespace std;

class Circle: public Point{
    Point center;
    double radius;

public:
    Circle(Point ct, double rd);
    Point get_center();
    double get_radius();
    void print();
    void print(string s);
    void println();
    void println(string s);

};

#endif /* CIRCLE_H_ */



#include "point.h"
#include <cmath>
using namespace std;

Point::Point(double x, double y){
        x_coord = x;
        y_coord = y;
}

double Point::get_x(){
    return x_coord;
}

double Point::get_y(){
    return y_coord;
}

void Point::print(){
//post: has printed the contents of the Point object in the format
    cout << "<Point( “ " << x_coord <<" ” , “ " << y_coord << " ” )>";
}


void Point::print(string s){
//post: has printed string s first, then printed the contents of the Point object
    cout << s << " ";
    print();
}

void Point::println(){
//post: has printed the contents of Point object, then moved the cursor to the next line
    print();
    cout << endl;
}

void Point::println(string s){
//post: has printed string s first, then printed the contents of the Point object, and moved the cursor to the next line
    cout << s << " ";
    println();
}

void Point::move(double dx, double dy){
// post: x_coord = x_coord + dx, y_coord = y_coord + dy
    x_coord = x_coord + dx;
    y_coord = y_coord + dy;
}

double Point::distance(Point that){
//post: returns the distance between this Point and that Point
    return sqrt( pow(x_coord - that.get_x(),2) + pow(y_coord - that.get_y(),2) );
}

bool Point::equals(Point that){
//post : returns true if this Point and that Point have the same coordinates
    return (x_coord = that.get_x());
}


#ifndef POINT_H_
#define POINT_H_

#include <iostream>

using namespace std;

class Point{

protected:
    double x_coord;
    double y_coord;

public:
    Point(double x, double y);
    Point();
    double get_x();
    double get_y();
    void print();
    void print(string s);
    void println();
    void println(string s);
    void move(double dx, double dy);
    double distance(Point that);
    bool equals(Point that);

};

#endif /* POINT_H_ */


#include <iostream>
#include <cstdlib>
using namespace std;

#include "point.h"
#include "circle.h"

void test1(){
    cout << "test1:" << endl;

    Point p1 = Point(2,3);
    cout << "Point p1 is created, the data of p1 = (2,3)" << endl;
    cout << "p1.get_x() -> " << p1.get_x() << endl;
    cout << "p1.get_y() -> " << p1.get_y() << endl << endl;

    p1.println("p1.println() -> ");
    cout << endl;

    cout << "end test1" << endl << endl;
}

void test2(){
    cout << "test2:" << endl;

    cout << "Point p1 is created, the data of p1 = (2,3)" << endl;
    cout << "Point p2 is created, the data of p2 = (0,0)" << endl;
    Point p1 = Point(2,3);p1.println("p1.println() -> ");
    Point p2 = Point(0,0);p2.println("p2.println() -> ");
    cout << endl;

    p1.println("p1 before move -> ");
    cout << "p1.move(1,1)" << endl;p1.move(1,1);
    p1.println("p1 after move -> ");
    cout << endl;

    cout << "p1.distance(p2) -> " << p1.distance(p2) << endl << endl;
    cout << "p1.equals(p1)   -> " << p1.equals(p1) << endl;
    cout << "p1.equals(p2)   -> " << p1.equals(p2) << endl;
    cout << "end test2" << endl << endl;
}

int main(){

    test1();
    test2();

    return 0;
}
juanchopanza
  • 223,364
  • 34
  • 402
  • 480
user2894691
  • 21
  • 1
  • 2

1 Answers1

2

The compiler is telling you to define

Point::Point()

which you have only declared in the Point class definition. A possible implementation would be to initialize both coordinates with 0.0:

Point::Point() : x_coord(0.0), y_coord(0.0) {}

You have to explicitly initialize the members in this case because built-in types do not get zero-initialized when default constructed.

juanchopanza
  • 223,364
  • 34
  • 402
  • 480