在.cpp文件中包含包含类的标头无法正常工作

时间:2018-12-17 15:33:53

标签: c++

我在这样的标题中编写了一个测试类:

File.h

#ifndef FILE_H
#define FILE_H

class File {
    fstream stream;
public:
    File(string path);
    ~File();
};

File::File(string path) {
    stream.open(path);
}

File::~File() {
    stream.close();
}

#endif // FILE_H

在另一个文件中,我像这样包含并使用它:

t.cpp

#include <iostream>
#include <string>
#include <fstream>
#include "/home/unlimiter/Documents/programming/modules/cpp/uio/File.h"
using namespace std;

int main(int argc, char *argv[]) {
    File f("/home/unlimiter/tst");
}

为什么我这样做时会发生错误(例如未定义fstream)?

  

我测试了在't.cpp'中编写类,并且效果很好

1 个答案:

答案 0 :(得分:5)

  1. 确实没有fstream这样的东西。它的拼写为std::fstream
  2. std::string相同。
  3. 有些人会通过写using namespace std来告诉您解决此问题。 Don't(如果仅是因为您需要在标头中执行此操作,这被认为是不好的)。
  4. 最好将这些#include放在需要它们的文件中,即标头本身。否则,您需要依靠一堆东西才能​​使它们中的任何一个起作用(这也被认为是不好的)。
  5. 尽量不要在#include指令中使用绝对路径:这会使您的源代码难以在您的计算机或其他计算机上移动。可以通过您的编译环境/ bulid系统更好地管理这种事情。
  6. 现在您需要将函数定义移至.cpp文件(或者可能是新的File.cpp!),因为一旦将标头包含在多个翻译单元中,链接器就会抱怨关于多个定义。