C ++不能使用其他文件中的类

时间:2018-06-05 23:27:52

标签: c++ file class header

我是编写小程序的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中的构造函数。你能帮助一个菜鸟吗?

谢谢, 小白

1 个答案:

答案 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?)的其他规则中,绝不会在代码中的任何位置连续放置两个下划线。