класс с ++ зачем нужен основной? - PullRequest
1 голос
/ 19 марта 2009

Здравствуйте, я пишу небольшой проект на c ++, где я хотел бы иметь некоторые классы, которые делают некоторую работу, я написал интерфейсы и реализацию классов.

Меня удивляет то, что у меня не может быть простого класса без main (), я хотел бы иметь класс, который когда-то будет создан, его методы можно вызывать, делать что-то, но мне это не нужно хочу) main () в реализации класса. Вот пример того, что я хотел бы иметь в своей голове:

файл animal.h:

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

 public:
   int method1(int arg1);

 private:
   int var1;
};

file animal.cpp:

#include "animal.h"

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

И я хотел бы вызвать класс животных из другого файла и заставить его работать, что-то вроде этого: файл app.cpp:

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

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

Но компилятор даст мне

/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 

для animal.cpp, но мне там не нужна сеть, или она мне нужна?

Где я не прав?

Ответы [ 5 ]

19 голосов
/ 19 марта 2009

но мне не нужен (и не нужен) main () в реализации класса.

Функция main является вашей точкой входа. Вот где начинается казнь. У вас должна быть одна и только одна такая функция.

Но компилятор дает мне "неопределенную ссылку на main" для animal.cpp, но мне там не нужен main, или он мне нужен?

Теперь ваша проблема выглядит так, как будто вы не связали скомпилированные формы app.cpp и animal.cpp.

Я не так силен в Makefiles, я использовал что-то вроде g ++ animal.h -o animal и g ++ animal.cpp, но это выдает ошибку выше

Вы не компилируете заголовки. Так что не используйте: g++ animal.h

Когда вы компилировали animal.cpp отдельно, g ++ создал объектный файл. Вам также нужно будет скомпилировать app.cpp, потому что вам нужно main. После компиляции файла app.cpp вам нужно будет связать его с ранее созданным объектным файлом animal. Но если они не были связаны, особенно в файле, содержащем функцию main, вы получите ошибку, которую вы получаете сейчас.

Однако g++ заботится о том, что я описал выше. Попробуйте что-то вроде этого:

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

Это создаст исполняемый файл с именем test, и вы сможете запустить ваше приложение, используя:

./test
6 голосов
/ 19 марта 2009

Во-первых, это неправильно: animal dog = new animal();

Вам либо нужно

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

или предпочтительно просто

animal dog;

Во-вторых, вам нужно связать воедино объектные файлы, созданные путем компиляции двух исходных файлов .cpp.

gcc -o animal animal.cpp app.cpp 

должен добиться цели, если вы используете gcc.

4 голосов
/ 19 марта 2009

Вам следует либо скомпилировать их вместе (в одной команде g++), либо скомпилировать их оба в объектные файлы (g++ -c), а затем использовать ld для связывания объектных файлов вместе.

Образец 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
1 голос
/ 19 марта 2009
class animal
{
 public: 
   animal();
  ~animal();

 public:
   method1(int arg1);

 private:
   int var1;
};

Обратите внимание, что вы не поставили точку с запятой в конце объявления класса. C ++ требует этого и иногда выдает сбивающие с толку / вводящие в заблуждение сообщения об ошибках, если вы об этом забыли.

0 голосов
/ 21 марта 2009
 public:
   method1(int arg1);

Вам не хватает возвращаемого типа для method1. Вы имели в виду что-то вроде

   int method1(int arg1);
...