gpt4 book ai didi

c++ - 运算符重载函数不能访问私有(private)成员

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:46 26 4
gpt4 key购买 nike

我想要一个重载函数,该函数从一个日期对象中减去另一个对象并返回天数差值。问题是我的重载函数完全看不到它的所有私有(private)变量。

我试图让它返回一个 Date 对象,但没有成功。

这是我的 .h 文件。

#pragma once
#include <iostream>
#include <string>
using namespace std;

class Date
{
private:
int day;
int month;
int year;
const int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

public:
Date();
// There are other functions here. That one below is what matters, I guess.
friend int operator - (const Date&, const Date&);
};

下面是我的 Date.cpp 文件的一些函数。

Date::Date()
{
day = 1;
month = 1;
year = 2000;
}

void Date::setDate()
{
cout << "Month: ";
cin >> month;

while (month < 1 || month > 12)
{
cout << "Invalid month. Try again: ";
cin >> month;
}

cout << "Day: ";
cin >> day;

while (day < 1 || day > monthDays[month - 1])
{
cout << "Invalid day. Try again: ";
cin >> day;
}

cout << "Year: ";
cin >> year;
}

构造函数可以毫无问题地访问 monthDays 数组。但这不能说关于运营商-:

int operator-(const Date& left, const Date& right)
{
int differenceDays = 0, oprTemp;

// Checks the year.
oprTemp = left.year - right.year;
if (oprTemp >= 0)
differenceDays += oprTemp * 365;
else
return -1;

// Checks the months.
oprTemp = left.month - right.month;
if (oprTemp >= 0)
{
for (int i = 0; i < oprTemp; i++)
differenceDays += monthDays[left.month - 1 - i];
}
else
return -1;

// Checks the day.
oprTemp = left.day - right.day;
if (oprTemp > 0)
differenceDays += oprTemp;

return differenceDays;
}

不要理会上面的函数逻辑。由于显而易见的原因,它尚未经过测试。 :)

我需要的是一个重载函数,用于返回两个 Date 对象之间的差异,并以整数形式返回天数差异。如果有坏数据,返回-1。

非常感谢您的耐心,对不起我的英语。谢谢。

最佳答案

这是由于 monthDays 是 Date 的非静态成员,所以它需要一个对象才能访问。由于 operator-(..) 是友元函数,因此没有 this。您可以将 monthDays 声明为静态并使用 Date::monthDays 或使用 leftmonthDays 成员>正确。因为 monthDays 在实例之间不会改变,所以它应该可以用于任何对象。

class Date
{
private:
int day;
int month;
int year;
const int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

public:
Date();
void setDate();
// There are other functions here. That one below is what matters, I guess.
friend int operator - (const Date&, const Date&);
};

Date::Date()
{
day = 1;
month = 1;
year = 2000;

}



void Date::setDate()
{
cout << "Month: ";
cin >> month;

while (month < 1 || month > 12)
{
cout << "Invalid month. Try again: ";
cin >> month;
}

cout << "Day: ";
cin >> day;

while (day < 1 || day > monthDays[month - 1])
{
cout << "Invalid day. Try again: ";
cin >> day;
}

cout << "Year: ";
cin >> year;
}

int operator-(const Date& left, const Date& right)
{
int differenceDays = 0, oprTemp;

// Checks the year.
oprTemp = left.year - right.year;
if (oprTemp >= 0)
differenceDays += oprTemp * 365;
else
return -1;

// Checks the months.
oprTemp = left.month - right.month;
if (oprTemp >= 0)
{
for (int i = 0; i < oprTemp; i++)
differenceDays += left.monthDays[left.month - 1 - i];
}
else
return -1;

// Checks the day.
oprTemp = left.day - right.day;
if (oprTemp > 0)
differenceDays += oprTemp;

return differenceDays;
}

关于c++ - 运算符重载函数不能访问私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57739071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com