繁体   English   中英

如何在与主函数不同的源文件中定义类?

[英]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 */

请参阅cppreference-默认构造函数

您应该避免的下一个问题是包括using namespace std; 在头文件中。 请参见c ++头文件中的“使用名称空间” 相反,只需对coutstd::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.cppgreeter.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM