2009-03-19 15 views
1

Hallo Ich schreibe ein kleines Projekt in C++, wo ich einige Klassen haben möchte, die etwas Arbeit macht, schrieb ich die Schnittstellen und die Implementierung der Klassen.C++ klasse warum brauchen main?

Die Sache, die mich überrascht ist, dass ich keine einfache Klasse ohne eine main() haben kann, möchte ich eine Klasse haben, die einst instanziiert, Es kann Methoden aufgerufen werden, Dinge tun, aber ich brauche nicht (noch will) ein main() in der Klassenimplementierung. Hier ist ein Beispiel, das ich in meinem Kopf habe, was ich haben möchte:

Datei animal.h:

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

public: 
    int method1(int arg1); 

private: 
    int var1; 
}; 

Datei animal.cpp:

#include "animal.h" 

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

Und ich mag Um die Tierklasse Formular eine andere Datei aufrufen und haben es funktioniert, etwa so: Datei app.cpp:

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

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

Aber Compiler geben Sie mir

/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 

für animal.cpp, aber ich habe kein Haupt es brauchen, oder brauche ich es?

Wo liege ich falsch?

+0

Es wäre hilfreich, die eigentliche Nachricht zu posten. Oft steckt der Teufel im Detail. –

+0

"Vergessen Sie nicht, den Hund zu löschen;!" Dies ist nicht notwendig, da es kein Zeiger ist, eigentlich sollte das Löschen eines Hundes in diesem Fall normalerweise zu einem Fehler führen. –

Antwort

19

aber ich brauche (noch wollen) eine main() in der Klassenimplementierung.

Die Funktion main ist Ihr Einstiegspunkt. Dort beginnt die Ausführung. Sie müssen eine und nur eine solche Funktion haben.

Aber Compiler geben mir "undefined Verweis auf Haupt" für animal.cpp, aber ich brauche kein Haupt dort, oder brauche ich es?

Jetzt sieht Ihr Problem wie Sie nicht haben die kompilierten Formen von app.cpp und animal.cpp verknüpft.

ich in Makefiles nicht so stark bin, habe ich so etwas wie g ++ animal.h -o Tier und g ++ animal.cpp aber es gibt mir den Fehler oben

Sie kompilieren nicht Header . Verwenden Sie also nicht: g++ animal.h

Wenn Sie die animal.cpp separat kompiliert haben, erstellt g ++ eine Objektdatei. Sie müssen auch die app.cpp kompilieren, weil Sie benötigen die main. Nachdem Sie die Datei app.cpp kompiliert haben, müssen Sie sie mit der zuvor erstellten Objektdatei animal verknüpfen. Aber wenn diese nicht in Verbindung gebracht werden, speziell die Datei mit der main Funktion, werden Sie den Fehler, den Sie jetzt bekommen, treffen.

Allerdings kümmert sich g++ um das, was ich oben beschrieben habe.so etwas wie dieses versuchen:

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

Dies wird eine ausführbare test genannt und Sie können Ihre Anwendung ausführen mit:

./test 
+0

Ich bin nicht so stark in Makefiles, ich habe etwas wie g ++ animal.h -o Tier und g ++ animal.cpp verwendet, aber es gibt mir den Fehler über – luiss

+0

Das sagt g ++, um animal.h in eine vollständige ausführbare Datei namens Tier, und animal.cpp in eine vollständige ausführbare Datei namens a.out (Standardname) und macht nichts mit app.cpp. Verwenden Sie das Makefile, das Mehrdad gepostet hat, oder kompilieren Sie alle Ihre cpp-Dateien auf einmal, wie es schon gesagt wurde. –

+0

Danke Jungs! Ich habe es jetzt funktioniert: D – luiss

4

Entweder sollten sie zusammen kompilieren (in einem einzigen g++ Befehl) oder beide kompilieren von ihnen zu Objektdateien (g++ -c) und dann ld verwenden, um die Objektdateien miteinander zu verknüpfen.

Beispielmakefile:

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

Ihr Beispiel Makefile scheint "-c" zu fehlen. – bk1e

+0

bk1e: Danke, korrigiert. –

6

Zuerst das ist falsch: animal dog = new animal();

Sie müssen entweder

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

oder vorzugsweise nur

animal dog; 

Zweitens müssen Sie Verknüpfen Sie die Objektdateien, die durch das Kompilieren der beiden Quellcpp-Dateien erstellt wurden.

gcc -o animal animal.cpp app.cpp 

sollte den Trick tun, wenn Sie gcc verwenden.

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

public: 
    method1(int arg1); 

private: 
    int var1; 
}; 

Beachten Sie, dass Sie am Ende der Klassendeklaration kein Semikolon gesetzt haben. C++ erfordert es und manchmal verwirrende/irreführende Fehlermeldungen, wenn Sie es vergessen.

+0

Tut mir leid, ich mache nur einen Fehler beim Schreiben hier, das Semikolon ist an seiner Stelle im Code: D danke – luiss

0
public: 
    method1(int arg1); 

Sie fehlen den Rückgabetyp für Methode1. Meinst du etwas wie

int method1(int arg1); 
+0

sicher, korrigiert jetzt, danke – luiss