复制构造函数参数为0

时间:2018-07-17 03:01:13

标签: c++ copy-constructor

我要减去两个Date对象,并在我的重载减号运算符中返回我创建的另一个Date类的实例。但是由于某种原因,在完成重载的减号函数并从初始化调用副本构造函数后,参数为0。为什么?

// Date.h

class Date
{
    int month, day, year;
    Date *datePtr = this;
public:
    Date();
    Date(Date &);
    bool operator==(const Date& obj);
    bool operator>(const Date& obj);
    Date operator-(const Date& obj);
    Date operator=(const Date& obj);

    friend istream &operator>>(istream& in, Date &obj);
    friend ostream &operator<<(ostream& out, Date &obj);
};

// test.cpp

cout << "Date 2 is later in time than Date 1 by \n";
Date temp = date2 - date1; //Overloaded minus called then Copy Constructor from initialization
cout << temp << endl;

//日期实现

Date Date::operator-(const Date& obj)
{
    Date tempDate = *this;

    if (tempDate.datePtr->day >= obj.day)
    {
        tempDate.datePtr->day = tempDate.datePtr->day - obj.day;
    }
    else
    {
        tempDate.datePtr->day = tempDate.datePtr->day + 30;
        tempDate.datePtr->day = tempDate.datePtr->day - obj.day;
    }
    if (tempDate.datePtr->month > 1)
    {
        tempDate.datePtr->month = tempDate.datePtr->month - 1;
    }
    else
    {
        tempDate.datePtr->month = 12;
        tempDate.datePtr->year = tempDate.datePtr->year - 1;
    }

    if (tempDate.datePtr->month >= obj.month)
    {
        tempDate.datePtr->month = tempDate.datePtr->month - obj.month;
    }
    else
    {
        tempDate.datePtr->month = tempDate.datePtr->month + 12;
        tempDate.datePtr->month = tempDate.datePtr->month - obj.month;
        tempDate.datePtr->year = tempDate.datePtr->year - 1;
    }

    tempDate.datePtr->year = tempDate.datePtr->year - obj.year;
    return tempDate;
}

//复制构造函数

Date::Date(Date &obj)
{    /*obj.month, day and year is 0 here but should be the value from return Date instance from overloaded minus function.*/
    cout << "INSIDE COPY CONSTRUCTOR" << obj.month << "/" << obj.day << endl;
    datePtr = new Date;
    (*datePtr).month = obj.month;
    (*datePtr).day = obj.day;
    (*datePtr).year = obj.year;
}

1 个答案:

答案 0 :(得分:2)

您实际上需要将datePtr对象保存到副本构造函数中的当前对象中。您确实为datePtr设置了月/日/年,但这并不影响该对象的当前实例。这是因为(在您的头文件中)尽管您设置了datePtr = this,但这并不意味着datePtr this。它只是指向此地址(或当前实例)。调用datePtr =新日期;只需更改datePtr指向的位置,而不是它指向的数据即可。将您的副本构造函数更改为如下所示:

Date::Date(const Date &obj)
{
    this->month = obj.month;
    this->year = obj.year;
    this->day = obj.day;
}

正如评论中的某人指出的那样,成员初始化列表也将是实现此目的的一种方法。为什么要使用它们的原因有很多,这里有个不错的阅读场所:https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/

如果您想查看它,这是使用成员初始化列表显示的代码的样子:

Date::Date(const Date &obj) : month(obj.month), year(obj.year), day(obj.day)
{
    // Nothing <3
}