2015-09-07 47 views
-2

我想學習如何使用.h文件與我的.cpp文件,並且任何時候我運行我的代碼我收到幾乎每個變量都有錯誤。獲取頭文件與.cpp文件一起工作

這裏是我的.h文件:

class Person 
{ 
public: 
    Person(
     string firstNames, 
     string lastNames, 
     string socialSecurityNumber, 
     string gender) 
     : firstNames(firstNames), 
     lastNames(lastNames), 
     socialSecurityNumber(socialSecurityNumber) 
     {} 

    string getFirstNames() const; 
    void setFirstNames(string aFirstNames); 

    string getLastNames() const; 
    void setLastNames(string aLastNames); 

... 

private: 
    string firstNames; 
    string lastNames; 
    string socialSecurityNumber; 
    string gender; 
}; 

我.cpp文件:

#include "stdafx.h" 
#include <ctime> 
#include <string> 
#include "Person.h" 
using namespace std; 

string Person::getFirstNames() const 
{ 
    return firstNames; 
} 

void Person::setFirstNames(string aFirstNames) 
{ 
    firstNames = aFirstNames; 
} 

string Person::getLastNames() const 
{ 
    return lastNames; 
} 

功能繼續爲其他變量,你可以在我的構造函數中看到。每當我試圖建立這樣它給我的錯誤,如:

「getFirstNames」不是「人」
「getFirstNames」的成員:修飾符不允許在非成員函數
「firstNames」未聲明的標識符

我剛開始學習C++和使用頭文件,但來自Java背景,不知道爲什麼會出現這些錯誤。從我在網上做的研究來看,這應該是有效的,但顯然它沒有。任何幫助將是偉大的,謝謝。

+1

由於您在頭文件中使用(std::)字符串,因此您還需要在頭文件中包含#include 。 – melak47

+2

這三個消息是編譯器發出的* first *消息嗎?始終從第一條消息開始。後續的消息很可能只是第一個錯誤的副作用。修復第一個錯誤,後面的錯誤可能會在下一次編譯時消失。 –

+0

@ melak47我在頭文件中包含字符串 –

回答

2

Person的定義在using namespace std之前,所以string在標頭中的使用無效。

這是很好的做法頭文件沒有依賴關係必須被首次列入,並確保這種情況,我總是包括前庫或系統頭我的本地標題:

#include "Person.h" 
#include <ctime> 
#include <string> 

在你的頭,確保它包括它所需要的:

#ifndef PERSON_H_INCLUDED 
#define PERSON_H_INCLUDED 
#include <string> 
class Person 
{ 
public: 
    Person(
      std::string firstNames, 
      std::string lastNames, 
      std::string socialSecurityNumber, 
      std::string gender) 
     : firstNames(firstNames), 
     lastNames(lastNames), 
     socialSecurityNumber(socialSecurityNumber) 
     {} 
    ... 
}; 
#endif 

不要在頭文件被誘惑using namespace - 帶來符號到全局命名空間,被認爲是粗魯到u頭文件的sers。 (在一個國際性問題上 - 小心假設每個人都有「名」和「姓」,以及哪些(如果有的話)是「姓氏」......)

+0

你說:「我總是在庫或系統頭之前包含我的本地頭文件」。你可以擴展,因爲我總是做相反的可讀性(包括,Windows /其他API包括,我的垃圾在最後!)。 – camelCase

+1

如果我缺少'Person.h'頭文件中的'#include ',我會很快發現它,如果它位於包含的頂部(並且每當有匹配的實現文件,它將_will_成爲第一個包含的頭文件一)。如果我總是把它包含在最後,那麼錯誤可能會被掩蓋很長一段時間,並且當不再需要一個看起來不相關的標題(其中包括'')時,它可能突然停止工作。我喜歡快速發展。 –

2

作爲確認由OP(參見問題註釋):

.h文件缺少以下行:

using namespace std; 

頭用string,這是std命名空間的一部分。

或者,將所有string實例替換爲std::string(因此,不需要using namespace std行)。

+1

「替代」是更好的方法 - 不要將使用指令放入頭文件中,並且_really_不要預先依賴頭文件中的先前使用指令。 –

+0

@TobySpeight - 同意了,但在OP獲得對一般名稱空間的理解之前,不想進入像ADL這樣的主題。 – camelCase