我是编写小程序的C ++。我也是处理多个文件的重点。我坚持使用另一个文件中的类。我做了一个简单的测试项目来演示我的问题。我有3个文件。
testheader.h
#ifndef __testheader_H_INCLUDED__ // if Node.h hasn't been included yet...
#define __testheader_H_INCLUDED__ // #define this so the compiler knows it has been included
#include <string>
#include <iostream>
class testheader {
public:
testheader(std::string name){}
void write(){}
};
#endif
testheader.cpp
#include <string>
#include <iostream>
using namespace std;
class testheader {
public:
testheader(string name){
cout << name << endl;
}
void write(){
cout << "stuff" << endl;
}
};
anotherfile.cpp
#include <iostream>
#include "testheader.h"
using namespace std;
int main () {
cout << "testing" << endl;
testheader test("mine");
test.write();
return 0;
}
我使用g ++使用命令
在Linux中编译它们g++ -std=c++11 testheader.cpp anotherfile.cpp testheader.h -o another
当我运行“另一个”可执行文件时,输出是
测试
我期待的是输出
测试 矿 东西
似乎我的类对象“test”正在编译为null。我不确定它是我的标题还是文件没有正确链接。当在main中创建testheader对象时,它显然没有按预期调用testheader.cpp中的构造函数。你能帮助一个菜鸟吗?
谢谢, 小白
答案 0 :(得分:3)
在testheader.h中
testheader(std::string name){}
声明并实现一个什么都不做的函数,而不是定义它并在其他地方实现它。这就是所谓的而不是打印。你想要
testheader(std::string name);
现在main
可以看到函数存在,链接器会查找它(一旦修复了两个和三个,就在testheader.cpp中找到它。
g++ -std=c++11 testheader.cpp anotherfile.cpp testheader.h -o another
不编译头文件。头文件的副本包含在#include
的所有文件中。仅编译实现文件,所以
g++ -std=c++11 testheader.cpp anotherfile.cpp -o another
testheader
在testheader.h中定义。只有静态成员的函数和存储的实现需要在testheader.cpp中。
示例testheader.cpp:
#include <string>
#include <iostream>
#include "testheader.h" // so it knows what testheader looks like
using namespace std;
testheader::testheader(string name)
{
cout << name << endl;
}
void testheader::write()
{
cout << "stuff" << endl;
}
旁注:__testheader_H_INCLUDED__
是非法标识符。关于如何/在何处使用下划线(What are the rules about using an underscore in a C++ identifier?)的其他规则中,绝不会在代码中的任何位置连续放置两个下划线。