Pergunta

Olá Estou escrevendo um pequeno projeto em C ++ onde eu gostaria de ter algumas classes que faz algum trabalho, eu escrevi as interfaces e a implementação das classes.

A única coisa que me surpreende é que eu não posso ter uma classe simples sem um main (), eu gostaria de ter uma classe que, uma vez instanciado, seus métodos podem ser chamados, fazer as coisas, mas eu não preciso (nem quer) um main () na implementação de classe. Aqui está um exemplo que eu tenho na minha cabeça do que eu gostaria de ter:

arquivo animal.h:

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

 public:
   int method1(int arg1);

 private:
   int var1;
};

arquivo animal.cpp:

#include "animal.h"

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

E eu gostaria de chamar a classe animal formam um outro arquivo e tê-lo trabalhar, algo como isto: arquivo app.cpp:

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

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

Mas compilador dá-me

/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 

para animal.cpp, mas eu não preciso de um principal lá, ou eu preciso dele?

Onde estou errado?

Foi útil?

Solução

mas eu não preciso (nem quero) um main () na implementação de classe.

A função main é o seu ponto de entrada. É aí que a execução começa. Você precisa ter uma e apenas uma tal função.

Mas compilador me dar "undefined reference to main" para animal.cpp, mas eu não preciso de um principal lá, ou eu preciso dele?

Agora, a sua aparência problemáticas como você não tem ligado as formas compiladas de app.cpp e animal.cpp.

Eu não sou tão forte em Makefiles, eu usei algo como g ++ animal.h -o animais e g ++ animal.cpp mas dá-me o erro acima

Você não compilar os cabeçalhos. Portanto, não use: g++ animal.h

Quando você compilou o animal.cpp separadamente, g ++ criado um arquivo objeto. Você também vai precisar para compilar o app.cpp porque você precisa o main. Uma vez que você compilar o arquivo app.cpp terá de vinculá-lo com o arquivo animal objeto criado anteriormente. Mas se estes não ficar ligado em, especialmente, o arquivo que contém a função main você vai bater o erro que você está recebendo agora.

No entanto, g++ cuida do que eu descrevi acima. Tente algo parecido com isto:

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

Isto irá criar um chamado test executável e você pode executar o aplicativo usando:

./test

Outras dicas

Em primeiro lugar, isso é errado: animal dog = new animal();

Você quer necessidade

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

ou de preferência apenas

animal dog;

Em segundo lugar, você precisa para unir os arquivos de objetos produzidos pela compilação de seus dois arquivos fonte .cpp.

gcc -o animal animal.cpp app.cpp 

deve fazer o truque, se você estiver usando gcc.

Você deve ou compilá-los juntos (em um único comando g++) ou compilar os dois para arquivos objeto (g++ -c) e, em seguida, usar ld para ligar os arquivos de objetos juntos.

Amostra 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;
};

Observe que você não colocou um ponto e vírgula no final da declaração da classe. C ++ exige isso e às vezes dá confundindo / enganosa mensagens de erro se você esquecê-lo.

 public:
   method1(int arg1);

Está faltando o tipo de retorno para method1. Fez-lhe algo dizer, como

   int method1(int arg1);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top