Fichiers d'en-tête C ++ - Ce qu'il faut inclure

J'ai écrit une classe très simple en C++, à savoir qu'il est la classe Rectangle de http://www.cplusplus.com/doc/tutorial/classes/. En particulier, voici le contenu du fichier d'en-Tête (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

Ici est la mise en œuvre (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;
}

Maintenant, je suis censé inclure l'en-Tête de Rectangle dans ma classe principale, c'est:

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

using namespace std;

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

Mais, ensuite, j'obtiens l'erreur:

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

L'erreur est résolue si j'inclus le fichier Rectangle.cpp au lieu de cela. (Je suis en cours d'exécution sur Eclipse)

Suis-je censé inclure le fichier CPP au lieu de cela, après tout?

Voici mon 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)

Comment puis-je le modifier pour compiler la classe Rectangle?

Solution: en Fonction de la réponse de l'utilisateur v154c1, il est nécessaire de compiler individu fichiers cpp et de l'inclure leurs têtes dans le fichier principal ou dans n'importe quel autre fichier où cette fonctionnalité est nécessaire. Voici un exemple de Makefile pour le faire:

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)

source d'informationauteur Pantelis Sopasakis | 2012-11-18