0

假设有一个源文件 un2.cpp

----un2.cpp----

class employee;
void employee::setname(string s)
{
.....(some  code)
}

雇员类在 un2.h 中定义,其中声明了 setname()。现在,当我尝试通过 'cc -c un2.cpp -o un2.o' 编译 un2.cpp 时,我收到一条错误消息

 un2.cpp:3:16: error: invalid use of incomplete type ‘struct employee’
 un2.cpp:1:7: error: forward declaration of ‘struct employee’

为什么编译器不将employee 作为外部符号(就像它采用先前声明但未定义的符号一样)并编译un2.cpp 文件。

编译普通的未定义符号和未定义的类有什么区别吗?还有谁能告诉我(如果可能的话),只转发声明一个类并在其中定义符号的方法?

4

3 回答 3

3

external 用于链接器,在编译代码时不会帮助您,因为编译器仅通过编写前向声明不知道您的类声明。

相反,您需要在 un2.cpp 文件中包含带有声明的标头才能进行编译。

于 2012-08-15T13:07:35.023 回答
2

关键是类不是用符号表示的,而是必须知道完整的类结构才能生成代码。首先,编译器需要类定义来检查该类是否employee确实包含一个名为setnametake a stringand return 的成员函数void(如果没有,编译器必须返回一个错误)。此外,您需要在函数内访问类的其他成员(调用其他成员函数或访问数据成员),因此您需要这些声明,它们是类定义的一部分。在链接时,类名完全消失了(除了调试信息,以及作为成员函数和虚拟表符号的一部分)。

通常,在编写头文件的实现文件时,您应该在实现文件中包含头文件。这将确保您拥有定义在那里声明的所有内容所需的一切,除此之外还测试头文件,前提是您将其作为实现文件中的第一件事。

于 2012-08-15T13:13:16.883 回答
2

您没有将文件包含在类的声明中。前向声明在这里没有帮助,因为编译器不知道类是否包含这样的方法。

包括头文件,错误应该消失。

于 2012-08-15T13:10:54.910 回答