将内联类成员函数声明和定义分离到不同的文件(标题和源)

时间:2016-07-08 13:44:58

标签: c++ class oop

我有3个文件: main.cpp gp_frame.cpp gp_frame.h 。我希望在 gp_frame.h 中声明一个类(名为gp_frame)并在 gp_frame.cpp 中定义成员函数,并希望在 main.cpp中使用该类

概括地说,这三个文件:

/*main.cpp*/
#include "gp_frame.h"

void plotpicture(unsigned int a, unsigned int b, unsigned int c, unsigned int d, unsigned int e){
 anita.wait_enter("Some string\n");
}

int main(){
 gp_frame anita(true);
 plotpicture(1,2,3,4);
 return 0;
}

/*gp_frame.h*/

class gp_frame{
 public: void wait_enter(std::string uzi);
 gp_frame();
 gp_frame(bool isPersist);
};

/*gp_frame.cpp*/
#include "gp_frame.h"

void gp_frame::wait_enter(std::string uzi){
 /*Some of code*/
}
gp_frame::gp_frame(){
 /*Some of code*/
}
gp_frame::gp_frame(bool isPersist){
 /*Some of code*/
}

然后,我想编译并链接文件:

g++ -c main.cpp -w -Wall
g++ -c gp_frame.cpp -w -Wall
g++ gp_frame.o main.o -o Myprogram

一切正常。但是,如果我想声明/定义函数 wait_enter inline,如:

/*in gp_frame.h*/
public: inline void wait_enter(std::string uzi);
/*in gp_frame.cpp*/
inline void gp_frame::wait_enter(std::string uzi){
 /*Some of code*/
}

编译器也可以工作,但链接器会抛出一个错误:

main.o: In function `plotpicture(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)':
main.cpp:(.text+0x2c6b): undefined reference to `gp_frame::wait_enter(std::string)'
collect2: error: ld returned 1 exit status

你能解释我如何解决问题或者我错在哪里吗?

可悲的是,extern inlinestatic inline都没有解决我的问题。

1 个答案:

答案 0 :(得分:3)

  

我错了什么?

您声明了一个内联函数gp_frame::wait_enter(std::string),但是您没有在使用该标准所需函数的所有编译单元(源文件)中定义该函数。

特别是,您只在gp_frame.cpp中定义了该功能,但未在main.cpp中定义,即使您使用main.cpp中的功能。

  

如何解决问题

在使用它们的所有编译单元中定义内联函数。这样做的惯用方法是在同样的标题中定义它们,并在这种情况下声明它们(在这种情况下为gp_frame.h)。