2014-09-24 43 views
1

我是新來的C++,所以我仍然不清楚文件如何鏈接在一起等等。我做的練習中,我有一個測試文件,bob_test.cpp,開始它的如下:當使用兩個cpp文件時使用未聲明標識符

#include "bob.h" 
#define BOOST_TEST_MAIN 
#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_CASE(stating_something) 
{ 
    BOOST_REQUIRE_EQUAL("Whatever.", bob::hey("Tom-ay-to, tom-aaaah-to.")); 
} 

在運動時,它給我寫「bob.cpp,」所以我的問題是,我如何編寫它以便它可以被測試文件識別?目前,我在第二行到最後一行得到了「使用未聲明的標識符'bob'」。我使用的是Xcode,我有一個bob.cpp和bob.h,幾乎是空的。

謝謝。

+0

是否有任何名爲'bob'的類'bob.h'有一個叫做'hey'的方法? – 2014-09-24 13:28:15

+3

或名爲'bob'的命名空間中存在一個名爲'hey'的免費方法 – Mgetz 2014-09-24 13:28:41

+0

它不需要通過'bob_test.cpp'被_「識別」_。包括相應的頭文件就足夠了。您只需確保'bob.cpp'與您的最終可執行文件相鏈接。 – 2014-09-24 13:29:41

回答

2

當你看到這樣

bob::hey("Tom-ay-to, tom-aaaah-to.") 

bob必須是一個命名空間或類,在bob.h聲明。該文件可以被稱爲任何東西 - 它不必與範圍解析運算符::左側的內容匹配。

你必須有一些其他地方(可能在bob.h),看起來像這樣:

class bob 
{ 
public: 
    static std::string hey(const std::string &s); 
} 

,或者稍微不太可能,

namespace bob 
{ 
    std::string hey(const std::string &s); 
} 

這包括在bob_test.cpp(由您的#include "bob.h")預處理器指令。

/// bob.cpp 
#include "bob.h" 
#include <string> 

std::string bob::hey(const std::string &s) 
{ 
    return "asdfasdfasdf"; 
} 

接頭,像bob.h,包含的內容基本上是一個接口定義(儘管它們可能含有的實現,以及 - 這是另一個討論)。聲明

#include "bob.h" 

告訴的是,在編譯過程中,應該打開bob.h,從字面上粘貼到位#include指令該文件的內容的編譯器,然後編譯.cpp,如果你已經把標題的內容在自己的CPP。

如果您試圖自己教這些東西,恭喜並堅持下去!

如果這是家庭作業,我建議你去辦公時間,拿一塊白板,用問題向你的老師胡椒,直到它清楚。教師的工作是儘可能使這些東西儘可能清晰和平易近人。 (我教過 - 清理事情並不容易,我歡迎學生提出問題,最終,我希望我的所有學生都能理解並熱愛他們的工作。)

+0

謝謝!這是一個服務,發出練習,然後批評你的代碼。 – jaxuru 2014-09-24 14:55:27