2009-03-19 17 views
1

Bonjour je suis en train d'écrire un petit projet en C++ où j'aimerais avoir des cours qui fonctionnent, j'ai écrit les interfaces et l'implémentation des classes. Ce qui me surprend, c'est que je ne peux pas avoir une classe simple sans main(), j'aimerais avoir une classe instanciée, ses méthodes peuvent être appelées, faire des choses, mais je n'en ai pas besoin (ni want) un main() dans la classe implémentation. Voici un exemple que je dans ma tête ce que je voudrais avoir:C++ classe pourquoi besoin de main?

fichier animal.h:

class animal 
{ 
public: 
    animal(); 
    ~animal(); 

public: 
    int method1(int arg1); 

private: 
    int var1; 
}; 
fichier

animal.cpp:

#include "animal.h" 

animal::animal(){...} 
animal::~animal(){...} 
int animal::method1(int arg1){return var1;} 
} 

Et je voudrais pour appeler la classe des animaux forme un autre fichier et le faire fonctionner, quelque chose comme ceci: fichier app.cpp:

#include <neededlib> 
#include "animal.h" 

int main() 
{ 
animal dog; 
cout << dog.method1(42); 
return 0; 
} 

Mais compilateur me donne

/usr/lib/gcc/i686-pc-linux-gnu/4.3.3/../../../crt1.o: In function _start: 

"(.text+0x18): undefined reference to `main`" 

collect2: ld returned 1 exit status 

pour animal.cpp, mais je ne pas besoin principal là, ou ai-je besoin?

Où est-ce que je me trompe?

+0

Il serait utile de poster le message. Souvent, le diable est dans les détails. –

+0

"Ne pas oublier de supprimer le chien;!" Il n'y a pas besoin de cela parce que ce n'est pas un pointeur, en fait, la suppression de chien devrait normalement dans ce cas entraîner une erreur. –

Répondre

19

mais je n'ai pas besoin (et je ne veux pas) de main() dans l'implémentation de la classe.

La fonction main est votre point d'entrée. C'est là que l'exécution commence. Vous devez avoir une et une seule telle fonction.

Mais le compilateur me donne "référence indéfinie à main" pour animal.cpp, mais je n'ai pas besoin de main, ou en ai-je besoin?

Maintenant, votre problème semble que vous avez pas liés les formes compilées de app.cpp et animal.cpp.

Je ne suis pas si forte dans Makefile, j'ai utilisé quelque chose comme g ++ animal.h -o animaux et g ++ animal.cpp mais il me donne l'erreur ci-dessus

Vous ne compilez pas les en-têtes . N'utilisez donc pas: g++ animal.h

Lorsque vous compilez le fichier animal.cpp séparément, g ++ crée un fichier objet. Vous aurez également besoin de compiler le app.cpp car vous avez besoin de le main. Une fois que vous compilez le fichier app.cpp, vous devrez le lier avec le fichier objet animal créé plus tôt. Mais si ceux-ci n'ont pas été liés, en particulier, le fichier contenant la fonction main vous obtiendrez l'erreur que vous obtenez maintenant.

Cependant, g++ prend en charge ce que j'ai décrit ci-dessus.Essayez quelque chose comme ceci:

g++ animal.cpp app.cpp -o test 

Cela va créer un fichier exécutable appelé test et vous pouvez lancer votre application à l'aide:

./test 
+0

Je ne suis pas si fort dans Makefiles, j'ai utilisé quelque chose comme g ++ animal.h -o animal et g ++ animal.cpp mais il me donne l'erreur ci-dessus – luiss

+0

Cela dit g ++ de faire animal.h dans un exécutable complet appelé animal, et animal.cpp dans un exécutable complet appelé a.out (nom par défaut), et ne fait rien avec app.cpp. Ether utilise le makefile que Mehrdad a posté, ou compile tous vos fichiers cpp à la fois comme dit dirkgently. –

+0

Merci les gars! Je l'ai maintenant fonctionné: D – luiss

4

Vous devez soit les compiler ensemble (en une seule commande g++) ou compiler les deux d'entre eux à des fichiers d'objet (g++ -c), puis utilisez ld pour lier les fichiers objet ensemble.

Makefile Exemple:

all: app.exe 

app.exe: app.o animal.o 
    g++ -o app.exe app.o animal.o 

app.o: app.cpp 
    g++ -c -o app.o app.cpp 

animal.o: animal.cpp animal.h 
    g++ -c -o animal.o animal.cpp 
+0

Votre échantillon Makefile semble manquer "-c". – bk1e

+0

bk1e: Merci, corrigé. –

6

En premier lieu, cela est faux: animal dog = new animal();

Vous avez besoin soit

animal * dog = new animal(); 
cout << dog->method1(42); 
delete animal; 

ou de préférence juste

animal dog; 

Deuxièmement, vous avez besoin lier ensemble les fichiers objets produits en compilant vos deux fichiers source .cpp.

gcc -o animal animal.cpp app.cpp 

devrait faire l'affaire, si vous utilisez gcc.

1
class animal 
{ 
public: 
    animal(); 
    ~animal(); 

public: 
    method1(int arg1); 

private: 
    int var1; 
}; 

Notez que vous n'avez pas placé de point-virgule à la fin de la déclaration de classe. C++ l'exige et donne parfois des messages d'erreur confus/trompeurs si vous l'oubliez.

+0

Désolé je viens de faire une erreur d'écriture ici, le point-virgule est à sa place dans le code: D thankyou – luiss

0
public: 
    method1(int arg1); 

Il vous manque le type de retour pour la méthode1. Vouliez-vous dire quelque chose comme

int method1(int arg1); 
+0

bien sûr, corrigé maintenant, merci – luiss

Questions connexes