使用父构造函数时遇到问题

时间:2015-03-12 01:12:18

标签: c++ inheritance constructor parent-child

我目前正致力于扩展我们之前制作的程序,包括使用头文件和父类。在原文中,我有2个头文件。 Person.h和OCCCDate.h。在新的,我正在创建一个名为OCCCPerson.h。它是一个非常简单的类,基本上只使用Person,只需添加1个变量。

我的问题是,我无法弄清楚如何正确使用父构造函数。

这是Person.h文件。

#ifndef PERSON_H
#define PERSON_H
#include <string>
#include "OCCCDate.h"
using namespace std;

class Person{

private:

string firstName;
string lastName;
OCCCDate dob;

public:

Person();
Person(string, string);
Person(string, string, OCCCDate);

string getFirstName();

string getLastName();

void setFirstName(string);

void setLastName(string);

int getAgeInYears();

bool equals(Person);

string toString();

};

#endif

这是我的OCCCPerson.h文件

#ifndef OCCCPERSON_H
#define OCCCPERSON_H
#include <string>
#include "OCCCDate.h"
#include "Perosn.h"
using namespace std;

class OCCCPerson : Person{

protected:

string studentID;

public:

OCCCPerson(string firstName, string lastName, OCCCDate dob, string studentID);
OCCCPerson(Person p, string studentID);

string getStudentID();

bool equals(OCCCPerson p);

string toString();

};

#endif;

我似乎无法调用父母构造函数来获取诸如firstname,lastname和dob(出生日期)之类的内容。从我的讲义中,它说父构造函数必须用::Person(参数)初始化,其中参数是父类中的东西。但是,我不知道该把它放在哪里。很抱歉写这么多。我只是无法弄清楚如何缩小它。

哦,这是OCCCDate.h以防万一

#ifndef OCCCDATE_H
#define OCCCDATE_H
#include<string>
using namespace std;

class OCCCDate{

private:

    bool OCCCDate_US;
    bool OCCCDate_EURO;
    int dayOfMonth, monthOfYear, year;
    bool dateFormat;

public:

    OCCCDate();
    OCCCDate(int dayOfMonth, int monthOfYear, int year);

    int getDayOfMonth();

    int getMonth();

    string getNameOfMonth();

    int getYear();

    string getDate();

    int getDifference(OCCCDate d1, OCCCDate d2);
    int getDifference(OCCCDate d1);

    void setDateFormat(bool);

    bool equals(OCCCDate d);

    string toString();

};

#endif

这是我的OCCCDate.cpp文件

#include<iostream>
#include<ctime>
#include "OCCCPerson.h"
using namespace std;

OCCCPerson::OCCCPerson(string firstName, string lastName, OCCCDate dob, string studentID):Person(firstName, lastName, dob){

    string firstName = Person::getFirstName();
    string lastName = Person::getLastName();
    OCCCDate dob = dob;
    this->studentID = studentID;

}

OCCCPerson::OCCCPerson(Person p, string studentID){

    Person p = p;
    this->studentID = studentID;

}

2 个答案:

答案 0 :(得分:0)

您需要的是成员初始化列表。 来自cppreference

  

在类的构造函数的定义中,成员初始化列表指定直接和虚拟基础子对象和非静态数据成员的初始化器。

一个简单的例子:

class MyClass : BaseClass
{
  public:
    MyClass(int arg) : BaseClass(arg) {
      //Rest of code
    }

}

在您的情况下,您可以这样做:

OCCCPerson(string firstName, string lastName, OCCCDate dob, string studentID) :
  Person(firstName, lastName, dob) {
  this.studentID = studentID;
}

答案 1 :(得分:0)

在OCCCPerson.cpp中,

OCCCPerson(string firstName, string lastName, OCCCDate dob, string 
studentID) : Person(firstName, lastName, dob)
{
//more stuff
}

您基本上必须使用初始化列表。 在此处阅读更多内容:What are the rules for calling the superclass constructor?

这样做是调用父构造函数Person(string, string, OCCCDate)并基本执行this->firstName = firstName。同样适用于lastNamedob。但不是studentID,因为Person(string, string, OCCCDate)构造函数不为studentID提供初始化。