1

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

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

文件动物.h:

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

 public:
   int method1(int arg1);

 private:
   int var1;
};

文件动物.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,但我不需要那里的main,还是我需要它?

我哪里错了?

4

5 回答 5

19

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

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

但是编译器给了我animal.cpp的“未定义的main引用”,但我不需要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
于 2009-03-19T20:18:55.487 回答
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,应该可以解决问题。

于 2009-03-19T20:24:49.510 回答
4

您应该将它们一起编译(在一个g++命令中)或将它们都编译为目标文件(g++ -c),然后使用ld将目标文件链接在一起。

示例生成文件:

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
于 2009-03-19T20:19:36.560 回答
1
class animal
{
 public: 
   animal();
  ~animal();

 public:
   method1(int arg1);

 private:
   int var1;
};

请注意,您没有在类声明的末尾放置分号。C++ 需要它,如果您忘记它,有时会给出令人困惑/误导性的错误消息。

于 2009-03-19T20:31:11.180 回答
0
 public:
   method1(int arg1);

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

   int method1(int arg1);
于 2009-03-21T02:21:31.657 回答