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?

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top