2013-11-23 65 views
1

我剛剛遇到了類繼承的代碼:構造函數無法被編譯器識別。任何成員函數都不是。 例如,如果我調用構造函數, 我testfile的(TEST.CPP)開始是這樣的:類繼承:編譯器無法識別的類的構造函數和成員函數

#include "salariedemployee.h"//This is a class inherited from 'employee.h', the base class 
#include "Administrator.h"//This is a class inherited from "salariedemployee.h" 
#include <iostream> 
#include <string> 
using std::cout; 
using std::endl; 
using namespace employeessavitch; 
int main() 
{ 
    Employee boss("Mr Big Shot","987-65-4321");//I try to call constructor in the base class "employee"; 
} 

如果我嘗試調用構造函數中的編譯器會發出像

undefined reference to `employeessavitch::Employee::Employee(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 

錯誤繼承的類,如

SalariedEmployee boss("Mr Big Shot","987-65-4321",10500.50);//a constructor about name, SSN number, and salary 

它給像一個錯誤:

undefined reference to `employeessavitch::SalariedEmployee::SalariedEmployee(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double)' 

我想知道發生了什麼問題?

我的基本類的頭文件寫爲:

#ifndef EMPLOYEE_H 
#define EMPLOYEE_H 
#include <string> 
using namespace std; 
namespace employeessavitch 
{ 
    Employee();//default constructor 
    Employee(string the_name, string the_ssn); constructor about name and ssn 
}#endif 

我的繼承類的頭文件寫爲:

#ifndef SALARIEDEMPLOYEE_H 
#define SALARIEDEMPLOYEE_H 
#include <string> 
#include "employee.h" 
using namespace std; 
namespace employeessavitch 
{ 
    class SalariedEmployee : public Employee 
    { 
     public: 
      SalariedEmployee();//default constructor 
      SalariedEmployee (string the_name, string the_ssn, double the_weekly_salary);//constructor about name, ssn and salary 
      //Other member function and variables are ommitted here. 
}#endif 

我敢肯定,命名空間是我能寫好嗎std cin和cout。

實現我的cpp文件是這樣的:

#include <string> 
#include <cstdlib> 
#include <iostream> 
#include "employee.h" 
using namespace std; 
namespace employeessavitch 
{ 
    Employee::Employee() : name("No name yet"), ssn("No number yet"), net_pay(0) 
    { 
    //deliberately empty 
    } 
} 

#include <iostream> 
#include <string> 
#include "salariedemployee.h" 
using namespace std; 
namespace employeessavitch 
{ 
    SalariedEmployee::SalariedEmployee() : Employee(), salary(0) 
    { 
    //deliberately empty 
    } 
    SalariedEmployee::SalariedEmployee(string the_name, string the_number, double the_weekly_salary): Employee(the_name, the_number), salary(the_weekly_salary) 
    { 
     //deliberately empty 
    } 
} 
+2

這意味着你需要你的Employee.cpp和SalariedEmployee.cpp正確鏈接 – billz

回答

2

我相信Employee構造函數沒有被聲明爲類定義的一部分。

在employee.h試試這個:

namespace employeessavitch 
{ 
    class Employee 
    { 
    public: 
    Employee();//default constructor 
    Employee(string the_name, string the_ssn); //constructor about name and ssn 
    }; 
} 
+0

我把它在一個單獨的.cpp文件,一模一樣 – jsh6303

+0

你可以分享你的cpp文件以及類CPP文件中的代碼它WUD更好.. – kameswarib

+0

'命名空間employeessavitch { 員工::員工():名稱( 「暫時還沒有名字」),SSN( 「暫時還沒有數」),net_pay(0) { //故意空 }}' – jsh6303

0

未定義參考只是意味着,即使它獲得函數定義(即從頭文件),它不是獲得功能的實現(SalariedEmployeeEmployee)。您是否在.cpp文件中實現了Employee(string the_name, string the_ssn);的功能?

+0

我想我做了這個構造函數的兩個類的實現。 – jsh6303

+0

我希望你的意思是說類和它裏面的方法?如果你分擔,你已經實現了包含這個功能的實現 –

0

下面的代碼,就可以(爲其他類做這個也可以):

#ifndef EMPLOYEE_H 
#define EMPLOYEE_H 
#include <string> 
using namespace std; 
namespace employeessavitch 
{ 
    Employee() 
    { 
    }//default constructor 
    Employee(string the_name, string the_ssn)// constructor about name and ssn 
    { 
    } 
}#endif 

或者,如果你認爲你已經有一個在.cpp文件中定義的實現,然後檢查以確保參數匹配。 cpp的實現應該如下所示:

employeessavitch::Employee::Employee() 
{ 
} 

employeessavitch::Employee::Employee(string the_name, string the_ssn) 
{ 
} 

此外,最好不要在頭文件中使用'using namespace'語句。原因是這意味着包含這個頭文件的任何代碼都會自動使用名稱空間,這種方式會使目標失敗。如果你不想擁有一個cpp文件,那麼在你的頭文件中使用'std ::'前綴而不是'using namespace std'。

對於是否有單獨的包含構造函數實現的.cpp文件,我不太確定。如果你這樣做,張貼這將有助於試圖協助你的問題。

+0

我添加.cpp文件。問題仍未解決。 – jsh6303

0

你必須既cstors的定義添加到您的employee.cpp文件。

這一個沒有定義:

Employee(); //cstor 
    Employee(string the_name, string the_ssn); // <-- This one isn't defined 

兩個cstor定義添加到您的文件,並將其編譯:

#include <string> 
    #include <cstdlib> 
    #include <iostream> 
    #include "employee.h" 

    using namespace std; 
    namespace employeessavitch 
    { 
     Employee::Employee() : name("No name yet"), ssn("No number yet"), net_pay(0) 
     { 
     //deliberately empty 
     } 

     Employee::Employee(string the_name, string the_ssn) // <-- is missing in 
     {             //  your cpp file 
     //deliberately empty 
     } 
    }