c ++类为什么需要main?

时间:2009-03-19 20:15:17

标签: c++ class main

您好我正在用c ++编写一个小项目,我希望有一些类可以完成一些工作,我编写了接口和类的实现。

让我感到惊讶的是,我没有一个没有main()的简单类,我希望有一个曾经实例化的类,它的方法可以调用,做事,但我不需要(也不是想要)类实现中的main()。 这是我想要拥有的一个例子:

file 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 个答案:

答案 0 :(得分:19)

  

但我不需要(也不想)类实现中的main()。

函数main是您的切入点。这就是执行开始的地方。你需要有一个且只有一个这样的功能。

  

但是编译器为animal.cpp提供了“未定义的主要引用”,但是我不需要main,或者我需要它吗?

现在,您的问题似乎没有链接 app.cppanimal.cpp的已编译表单。

  

我在Makefile中不是那么强大,我使用的东西比如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

答案 1 :(得分:6)

首先,这是错误的: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,

应该可以解决问题。

答案 2 :(得分:4)

您应该将它们一起编译(在单个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

答案 3 :(得分:1)

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

 public:
   method1(int arg1);

 private:
   int var1;
};

请注意,您没有在类声明的末尾添加分号。 C ++需要它,如果你忘了它,有时会给出令人困惑/误导的错误信息。

答案 4 :(得分:0)

 public:
   method1(int arg1);

您缺少method1的返回类型。你的意思是

   int method1(int arg1);