c ++ Klasse, warum braucht Haupt?
Frage
Hallo, ich bin ein kleines Projekt in c ++ zu schreiben, wo ich mag einige Klassen haben, die eine Arbeit tut, ich schrieb die Schnittstellen und die Umsetzung der Klassen.
Was mich überrascht, ist, dass ich nicht eine einfache Klasse ohne main () haben kann, würde Ich mag eine Klasse haben, die einmal instanziiert, kann es Methoden aufgerufen werden, Dinge tun, aber ich brauche nicht (noch will) ein main () in der Klasse Umsetzung. Hier ist ein Beispiel, das ich in meinem Kopf habe, was Ich mag würde haben:
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 möchte die Tierklasse aufrufen, eine andere Datei bilden und es funktioniert, so etwas wie folgt aus: 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 weiß nicht ein Haupt es brauchen, oder brauche ich es?
Wo bin ich falsch?
Lösung
aber brauche ich nicht (noch will) einen main () in der Klasse Umsetzung.
Die Funktion main
ist Ihr Einstiegspunkt. Das ist, wo die Ausführung beginnt. Sie benötigen einen haben und nur eine solche Funktion.
Aber Compiler geben Sie mir "undefined reference to main" für animal.cpp, aber ich weiß nicht ein Haupt es brauchen, oder brauche ich es?
Nun, Ihr Problem sieht aus wie Sie nicht haben verknüpft die kompilierten Formen von app.cpp
und animal.cpp
.
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. So verwenden Sie nicht: g++ animal.h
Wenn Sie die animal.cpp separat kompilieren, g ++ erstellt eine Objektdatei. Sie müssen auch die app.cpp
kompilieren, weil Sie müssen die main
. Sobald Sie die Datei app.cpp
kompilieren Sie es mit der animal
Objektdatei verknüpfen müssen zuvor erstellt hat. Aber wenn diese nicht in verlinkt werden, speziell die Datei, um die main
Funktion enthält, die Sie den Fehler getroffen werden Sie jetzt bekommen.
Allerdings dauert g++
Pflege von dem, was ich oben beschrieben habe. Probieren Sie etwas wie folgt aus:
g++ animal.cpp app.cpp -o test
Dies wird eine ausführbare Datei namens test
erstellen und Sie können Ihre Anwendung ausführen:
./test
Andere Tipps
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 die Objektdateien durch Kompilieren Ihre beiden Quell CPP-Dateien erzeugt miteinander verknüpfen.
gcc -o animal animal.cpp app.cpp
sollte es tun, wenn Sie gcc verwenden.
Sie sollten entweder sie zusammen kompilieren (in einem einzigen Befehl g++
) oder beide kompilieren Dateien (g++ -c
) zum Objekt und dann ld
verwenden die Objektdateien miteinander zu verknüpfen.
Beispiel Makefile:
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
class animal
{
public:
animal();
~animal();
public:
method1(int arg1);
private:
int var1;
};
Beachten Sie kein Semikolon am Ende der Klassendeklaration gelegt hat. C ++ erfordert es und manchmal verwirrend ergibt / irreführende Fehlermeldungen, wenn Sie es vergessen haben.
public:
method1(int arg1);
Sie vermissen den Rückgabetyp für method1. Meinen Sie so etwas wie
int method1(int arg1);