17

I have written a very simple class in C++, namely it is the Rectangle class from http://www.cplusplus.com/doc/tutorial/classes/. In particular here's the content of the Header file (Rectangle.h):

#ifndef RECTANGLE_H
#define RECTANGLE_H

class Rectangle {

private:
    double m_x;
    double m_y;

public:
    Rectangle();
    Rectangle(double, double);
    void setXY(double, double);
    double getArea();
};

#endif

Here is the implementation (Rectangle.cpp):

#include "Rectangle.h"

Rectangle::Rectangle() {
    setXY(1, 1);
}

Rectangle::Rectangle(double x, double y) {
    setXY(x, y);
}

void Rectangle::setXY(double x, double y) {
    m_x = x;
    m_y = y;
}

double Rectangle::getArea(void) {
    return m_x * m_y;
}

Now, I'm supposed to include the Header of Rectangle in my main class, that is:

#include <stdlib.h>
#include <iostream>
#include "Rectangle.h"

using namespace std;

int main(void) {
    Rectangle a;
    cout << "Area : " << a.getArea() << "\n";
    return EXIT_SUCCESS;
}

But, then I get the error:

make all 
g++ -O2 -g -Wall -fmessage-length=0   -c -o Chung1.o Chung1.cpp
g++ -o Chung1 Chung1.o 
Chung1.o: In function `main':
/home/chung/eclipse_ws/Chung1/Chung1.cpp:8: undefined reference to `Rectangle::Rectangle()'
/home/chung/eclipse_ws/Chung1/Chung1.cpp:9: undefined reference to `Rectangle::getArea()'
collect2: ld returned 1 exit status
make: *** [Chung1] Error 1

The error is resolved if I include the file Rectangle.cpp instead. (I'm running on Eclipse)

Am I supposed to include the CPP file instead after all?

Here's my Makefile:

CXXFLAGS =  -O2 -g -Wall -fmessage-length=0    
OBJS =      Chung1.o    
LIBS =    
TARGET =    Chung1    
$(TARGET):  $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)    
all:    $(TARGET)    
clean:
    rm -f $(OBJS) $(TARGET)    
run:    $(TARGET)   
        ./$(TARGET)

How can I modify it to compile the Rectangle class as well?

Solution: According to the answer from the user v154c1, it is necessary to compile individual cpp files and then include their headers in the main file or in any other file where this functionality is needed. Here's any example Makefile to do so:

CXXFLAGS =      -O2 -g -Wall -fmessage-length=0
#List of dependencies...
OBJS =          Rectangle.o Chung1.o
LIBS =
TARGET =        Chung1
$(TARGET):      $(OBJS)
        $(CXX) -o $(TARGET) $(OBJS) $(LIBS)
all:    $(TARGET)
clean:
        rm -f $(OBJS) $(TARGET)
run:    $(TARGET)
        ./$(TARGET)
gsamaras
  • 71,951
  • 46
  • 188
  • 305
Pantelis Sopasakis
  • 1,902
  • 5
  • 26
  • 45
  • You need to compile the other C++ file one way or another and link it together with the main file. Including it does that but it's often not the right thing to do. – Mat Nov 18 '12 at 16:08

3 Answers3

13

You are not compiling and linking the Rectangle class.

Your compilation should look like:

g++ -O2 -g -Wall -fmessage-length=0   -c -o Chung1.o Chung1.cpp
g++ -O2 -g -Wall -fmessage-length=0   -c -o Rectangle.o Rectangle.cpp
g++ -o Chung1 Chung1.o Rectangle.o

If you're using Makefile, then just add the Rectangle.cpp the same way you use Chung1.cpp. The same goes for any IDE you may be using.

v154c1
  • 1,698
  • 11
  • 19
2

No, you are not supposed to include the .cpp. You have to compile it, this should produce a .o file that is then linked to the main executable. Your main is failing to find and link to this .o file for whatever reason. Without knowing the exact compilation and linking steps you are taking it is difficult to say more.

juanchopanza
  • 223,364
  • 34
  • 402
  • 480
0

Typically the .h file is the class definition, so you are right. I do not think that you have included "Rectangle.h" in the compiler options.

cowboydan
  • 1,062
  • 7
  • 15