[英]How can I define my class in a different source file to my main function?
尽管很琐碎,但我只是想不出如何将源代码分成不同的文件。
当将其作为单个源文件编写时,我的代码可以编译并执行得很好:
#include <iostream>
using namespace std;
class Greeter{
public:
void greet();
};
void Greeter::greet(){
cout << "Hello World!";
}
int main(){
Greeter greeter;
greeter.greet();
return 0;
}
但是,请尝试将代码分成单独的源文件:
Greeter.h
#include <iostream>
using namespace std;
class Greeter{
public:
Greeter();
void greet();
};
Greeter.cxx
#include <iostream>
#include "Greeter.h"
using namespace std;
void Greeter::greet(){
cout << "Hello World!";
}
main.cxx
#include <iostream>
#include "Greeter.h"
using namespace std;
int main(){
Greeter greeter;
greeter.greet();
return 0;
}
总是会导致编译错误:
main.cxx:(.text+0x16): undefined reference to `Greeter::Greeter()'
目前尚不清楚这些评论是否解决了您的问题。 在将源分为标题和多个源时,该错误证明的主要问题是,在Greeter.h
包含了不完整的class Greeter
构造Greeter.h
。 具体来说,您无法包含“空参数列表”来完成构造函数,例如
Greeter() {}; /* default construct */
您应该避免的下一个问题是包括using namespace std;
在头文件中。 请参见c ++头文件中的“使用名称空间” 。 相反,只需对cout
, std::cout
进行调用即可,而无需完全包含名称空间。
接下来,尽管iostream
具有适当的标题保护,但您只需要将其包含在Greeter.cpp
(这是唯一使用iostream
函数的源)。 您还应该在Greeter.h
包含标头保护,以防止在编译过程中包含多个内容。 只需创建一个#define
并检查标题中是否已经定义了它,例如
greeter.h
#ifndef my_class_greeter_h
#define my_class_greeter_h 1
class Greeter {
public:
Greeter() {}; /* default construct */
void greet();
};
#endif
现在,如果已经定义了my_class_greeter_h
则每个包含greeter.h
文件greeter.h
将避免再次包含该文件。
greeter.cpp
具有类函数定义的源文件是唯一依赖iostream
调用的源文件,并且是唯一需要#include <iostream>
,例如
#include <iostream>
#include "greeter.h"
void Greeter::greet(){
std::cout << "Hello World!\n";
}
main.cpp中
您的main.cpp
源文件只需要包含包含类定义的标头即可,例如
#include "greeter.h"
int main (void) {
Greeter greeter; /* instantiate greeter */
greeter.greet(); /* call greet() */
return 0;
}
两种来源都必须编译
编译单独的源文件需要同时编译main.cpp
和greeter.cpp
(将greeter.cpp
编译为对象,或者仅将两个.cpp
文件都包含在编译字符串中)。
用gcc/clang
编译
$ g++ -Wall -Wextra -pedantic -std=c++11 -Ofast -o main main.cpp greeter.cpp
使用VS编译( cl.exe
)
> cl /nologo /W3 /Ox /EHsc /Femain /TP main.cpp greeter.cpp
(在没有警告的情况下编译之前,请不要接受代码)
使用/输出示例
无论哪种情况,输出都是预期的:
$ ./main
Hello World!
仔细检查一下,如果您还有其他问题,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.