所以我有这个奇怪的问题:当我导入一个单独的类的.h文件时,我非常基本的程序会生成一个错误消息(未定义引用'foo :: foo(int)')。但是,当我将导入文件更改为.cpp时,它一切正常。#include .h或.cpp文件?
现在,我已经读了一些,看过一些视频教程,他们都这样说:导入.h文件。那为什么它不工作?
我使用Code :: Blocks,在Windows 7中编译和运行(无命令行)。我确实怀疑某些东西设置不正确,但是我确实想知道它是否可以是我的代码失败了。
Main.cpp的:
#include <iostream>
#include "Foo.h" //This don't work. If i include Foo.cpp it does.
using namespace std;
int main()
{
Foo k(10);
cout << k.getInt() << endl;
}
了foo.h:
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo(int tall);
int getInt()const;
protected:
private:
int m;
};
#endif
Foo.cpp中:
#include "Foo.h"
Foo::Foo(int tall)
: m(tall)
{
//ctor
}
int Foo::getInt()const
{
return m;
}
可能是最好的拿起了一本书,并开始逐渐熟悉的基础知识! 1)你的程序不会产生错误,你的编译器会这样做。 2)它不是编译错误,而是链接错误。 3)你不“导入”头文件,你*包括*它。 4)了解翻译单元,模块化编译和链接。 –
好吧,我意识到我写这篇文章有点太快了。我确实知道这是编译器产生的错误,我可以猜到第二点(对连接还不太熟悉),第三点只是一个错误类型 - 我的第一语言是Java。不过,第四点似乎确实是个好主意。 谢谢。 – MartinHaTh
@MartinHaTh:关键的区别在于Java的'import'真的*导入*模块并为您找到所有相关文件,而在C++中,您所做的只是* include *文件的内容,头文件*文件 - 你仍然需要自己执行链接。所以术语的区别不仅仅在于恰当。 –