2016-03-17 32 views
3

我在不同的文件,.h和.cpp中試用這個繼承教程。繼承 - 不同的文件(C++)

我已經完成了必要的頭文件#include。 當我嘗試運行代碼時,我無法弄清楚代碼有什麼問題。 它有錯誤,指出:

嚴重性代碼說明項目文件行

Error C2011 'Person': 'class' type redefinition  
Error C2027 use of undefined type 'Person'  
Error C2065 'idNum': undeclared identifier 
Error C2065 'lastName': undeclared identifier 
Error C2065 'firstName': undeclared identifier  
Error C2027 use of undefined type 'Person'  
Error C2065 'idNum': undeclared identifier 
Error C2065 'firstName': undeclared identifier  
Error C2065 'lastName': undeclared identifier 
下面

是我的代碼:

Person.h

#include <iostream> 
#include <string> 

using namespace std; 
class Person { 

private: 
    int idNum; 
    string lastName; 
    string firstName; 
public: 
    void setFields(int, string, string); 
    void outputData(); 


}; 

void Person::setFields(int num, string last, string first) { 
    idNum = num; 
    lastName = last; 
    firstName = first; 

} 

void Person::outputData() 
{ 
    cout << "ID #" << idNum << " Name: " << firstName << " " << lastName << endl; 
} 

Customer.h

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

using namespace std; 
class Customer :public Person 
{ 

private: 
    double balanceDue; 
public: 
    void setBalDue(double); 
    void outputBalDue(); 
}; 

void Customer::setBalDue(double bal) { 
    balanceDue = bal; 
} 

void Customer::outputBalDue() { 
    cout << "Balance due $ " << balanceDue << endl; 
} 

的main.cpp

#include <iostream> 
#include <string> 
#include "Customer.h" 
#include "Person.h" 

using namespace std; 

int main() { 
    Customer cust; 
    //cust.setFields(215, "Santini", "Linda"); 
    //cust.outputData(); 
    cust.setBalDue(147.95); 
    cust.outputBalDue(); 

    return 0; 

} 

編輯: Person.h

#include <iostream> 
#include <string> 
#ifndef PERSON_H 
#define PERSON_H 

using namespace std; 
class Person { 

private: 
    int idNum; 
    string lastName; 
    string firstName; 
public: 
    void setFields(int, string, string); 
    void outputData(); 


}; 

void Person::setFields(int num, string last, string first) { 
    idNum = num; 
    lastName = last; 
    firstName = first; 

} 

void Person::outputData() 
{ 
    cout << "ID #" << idNum << " Name: " << firstName << " " << lastName << endl; 
} 
#endif 
+6

搜索:報頭包括警衛 – user463035818

+3

閱讀有關[* include防範*](HTTPS://en.wikipedia .ORG /維基/ Include_guard)。 –

+0

然後,不要在頭文件中定義*函數,除非將它們標記爲「inline」(明確或隱含地)。 –

回答

2

函數定義應該是在一個.cpp文件,而不是.h文件。

你需要這樣的:

customer.cpp中

#include <iostream> 
#include <string> 
#include "Customer.h" 

using namespace std; 

void Customer::setBalDue(double bal) { 
    balanceDue = bal; 
} 

void Customer::outputBalDue() { 
    cout << "Balance due $ " << balanceDue << endl; 
} 

的main.cpp

#include <iostream> 
#include <string> 
#include "Customer.h" 
#include "Person.h" 

using namespace std; 

int main() { 
    Customer cust; 
    //cust.setFields(215, "Santini", "Linda"); 
    //cust.outputData(); 
    cust.setBalDue(147.95); 
    cust.outputBalDue(); 

    return 0;  
} 

Person.cpp

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

void Person::setFields(int num, string last, string first) { 
    idNum = num; 
    lastName = last; 
    firstName = first;  
} 

void Person::outputData() 
{ 
    cout << "ID #" << idNum << " Name: " << firstName << " " << lastName << endl; 
} 

在頭文件中需要include guards

Customer.h

#ifndef _customer_inc_h_ 
#define _customer_inc_h_ // Include guard. This makes sure that 
          // Customer.h is included actually only once 
          // to avoid "multiple definition" errors 

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

using namespace std; 

class Customer :public Person 
{ 

private: 
    double balanceDue; 
public: 
    void setBalDue(double); 
    void outputBalDue(); 
}; 

#endif 

Person.h

#ifndef _person_inc_h_ 
#define _person_inc_h_ 

#include <iostream> 
#include <string> 

using namespace std; 

class Person { 

private: 
    int idNum; 
    string lastName; 
    string firstName; 
public: 
    void setFields(int, string, string); 
    void outputData(); 
}; 
#endif 
+0

對不起,它爲什麼這樣定義#ifndef _person_inc_h_ #define _person_inc_h_而不是#ifndef PERSON_H #define PERSON_H? – stack

+1

@stack因爲他喜歡那樣嗎?標題後衛宏名稱沒有任何意義,它們只需要是唯一的。 –

+0

@MichaelWalz不包括這樣的看守嗎?的#ifndef GRANDFATHER_H 的#define GRANDFATHER_H – stack