【问题标题】:C++ Class Inheritance: FunctionsC++ 类继承:函数
【发布时间】:2014-03-24 17:56:52
【问题描述】:

我一直在为我的物理学位的编程模块做一些课程,但我遇到了一些麻烦。我必须创建一个名为 Person 的类和一个名为 Employee 的子类,这样: Person.hpp:

#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:错误:使用未声明的标识符“员工”

我意识到我可能犯了一个非常基本的错误,但是我看不到它让我很沮丧。

任何帮助都会很棒! 提前致谢, 肖恩·库珀

注意employee.cpp 的目的是打印员工的姓名及其相关工作。

【问题讨论】:

  • #include "Employee.cpp" -- 这就是事情开始出错的地方。为了理智,您必须将接口与实现分开(decl/defn)。
  • 你的 cpp 文件应该包含他们需要包含的头文件。另外,你不想要这个 -> std::string job = Employee::getjob;,你声明了一个隐藏 job 成员的本地,只需使用 job 它应该可以工作。

标签: c++ class inheritance compiler-errors undeclared-identifier


【解决方案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(接口)以及所需的附加标头(如&lt;string&gt;)。您的 main.cpp 包含所有需要的标头,但没有其他 .cpp 文件。编译器将单独解析所有.cpp 文件,链接器会将结果链接到可执行文件中。根据经验,从不在任何地方包含.cpp

具体的错误是编译器看到的时候

void Employee::Print()

并且不知道Employee 是什么。包含Employee.hpp 通过引入Employee 的定义来解决此问题。

【讨论】:

    【解决方案2】:

    你的错误在这里:

    #include "Employee.cpp"
    

    永远不要包含.cpp 文件,将它们编译为链接阶段的单独输入。

    也不要忘记#include "Employee.hpp"Employee.cpp 文件中!同样的事情也适用于#include "Person.cpp" 等。

    【讨论】:

      【解决方案3】:

      您包含了几个 .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
      

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多