所以我有這個奇怪的問題:當我導入一個單獨的類的.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 *文件的內容,頭文件*文件 - 你仍然需要自己執行鏈接。所以術語的區別不僅僅在於恰當。 –