2014-03-24 85 views
-2

我一直在爲我的物理學位課程的編程模塊做一些課程,但是我遇到了一些麻煩。我不得不做出一個名爲Person類和調用Employee的子類這樣的: Person.hpp:C++類繼承:函數

#ifndef PERSON_HPP_ 
#define PERSON_HPP_ 

class Person { 
public: 
    Person(const std::string & name="Anonymous"): name(name) {;} 
    ~Person() {;} 

    std::string getname(){ 
     return name; 
    } 

    void setname(std::string newname) { 
     name = newname; 
    } 

    void Print(); 

private: 
    std::string name; 
}; 

#endif /* PERSON_HPP_ */ 

Person.cpp:

void Person::Print(){ 
    std::string name = Person::getname; 
    std::cout << name << std::endl; 
} 

Employee.hpp:

#ifndef EMPLOYEE_HPP_ 
#define EMPLOYEE_HPP_ 

class Employee: public Person { 
public: 
    Employee(const std::string & name, const std::string & job) : name(name), job(job){;} 
    ~Employee() {;} 

    std::string getjob(){ 
     return job; 
    } 

    void setjob(std::string newjob) { 
     job = newjob; 
    } 

    void Print() const; 

private: 
    std::string job; 
}; 

#endif /* EMPLOYEE_HPP_ */ 

Employee.cpp:

void Employee::Print(){ 
    Person::Print(); 
    std::string job = Employee::getjob; 
    std::cout << job << std::endl; 
} 

main.cpp中:

#include <iostream> 
#include <string> 
#include <vector> 
#include "Person.hpp" 
#include "Person.cpp" 
#include "Employee.hpp" 
#include "Employee.cpp" 
#include "Friend.hpp" 
#include "Friend.cpp" 

int main() { 
    return 0; 
} 

的錯誤是在我的employee.cpp。當建立這個錯誤顯示: ../Employee.cpp:10:6:錯誤:使用未聲明的標識符'員工'

我意識到我可能犯了一個非常基本的錯誤,但令我感到沮喪的是,我看不到。

任何幫助將是偉大的! 在此先感謝, 肖恩庫珀

N.B. employee.cpp的目的是打印員工的名字及其相關的工作。

+0

'#include「Employee.cpp」' - 這裏是事情開始出錯的地方。爲了理智,你必須將接口與實現分開(decl/defn)。 –

+0

你的cpp文件應該包含他們需要包含的頭文件。另外,你不需要這個 - >'std :: string job = Employee :: getjob;',你聲明一個隱藏'job'成員的本地,只需使用'job',它就可以工作。 – crashmstr

回答

1

include的應該是這樣的:

Person.cpp:

#include <iostream> 
#include <string> 
#include "Person.hpp" 

Employee.cpp:

#include <iostream> 
#include <string> 
#include "Employee.hpp" 

的main.cpp

#include <iostream> 
#include <string> 
#include <vector> 
#include "Person.hpp" 
#include "Employee.hpp" 
#include "Friend.hpp" 

那是,每個.cpp(實現)包括各自的.hpp(接口)以及所需的其他頭文件(如<string>)。您的main.cpp包含所有必需的標題,但不包含其他.cpp文件。編譯器將單獨解析所有的.cpp文件,鏈接器將結果鏈接到可執行文件。根據經驗,從不包括任何地方的.cpp

特定的錯誤是,當編譯器看到

void Employee::Print() 

,不知道是什麼Employee是。其中Employee.hpp通過引入Employee的定義修復此問題。

1

你的錯誤是在這裏:

#include "Employee.cpp" 

決不包括.cpp文件,讓他們編爲鏈接階段獨立的輸入。

也別忘了#include "Employee.hpp"Employee.cpp文件!類似地,同樣的事情適用於#include "Person.cpp"等。

1

你包含了幾個.cpp文件,而我想你打算包含頭文件。

除了:

Person::Print(); //this call is also wrong since Print() is not static 
    std::string job = Employee::getjob; 

getjob是一個成員函數,你錯過了(),當你調用成員函數。同時,getjob()不是一個靜態成員函數,它應該與該類的一個對象綁定。你打電話的方式是不正確的。同樣的錯誤發生在這裏:

std::string name = Person::getname; //inside Print() function of Person