【C++奇妙冒险】日期类Date的实现

文章目录

  • 前言
  • 日期类Date的接口设计
    • 构造函数和打印函数
    • 获取日期并判断日期是否合法
    • 日期类的大小比较关系
      • <运算符重载 判断小于
      • ==运算符重载 判断相等
      • <=运算符重载 判断小于等于
      • >运算符重载 判断大于
      • >= 运算符重载 判断大于等于
      • != 运算符重载 不等于
    • 日期类计算
      • 日期+=天数
      • 日期+天数
      • 日期-=天数
      • 日期-天数
      • 前置++
      • 后置++
      • 前置--
      • 后置--
      • 日期-日期
  • 完整代码
    • Date.h
    • Date.cpp
    • Test.cpp


前言

日期类Date的接口设计

我们把函数的声明放到类中,定义在类的外边,实现声明与定义分离

以下是日期类中所包含的成员函数和成员变量

🗨️Date.h

class Date
{
public:// 判断日期是否合法bool CheckInvalid() const;// 构造函数Date(int year = 1, int month = 1, int day = 1);// 日期类的大小关系比较bool operator<(const Date& d) const;bool operator<=(const Date& d) const;bool operator>(const Date& d) const;bool operator>=(const Date& d) const;bool operator==(const Date& d) const;bool operator!=(const Date& d) const;// d1 + 100Date& operator+=(int day);Date operator+(int day) const;// d1 - 100Date operator-(int day) const;Date& operator-=(int day);// ++d1Date& operator++();// 特殊处理:解决语法逻辑不自洽,自相矛盾的问题// d1++// 为了跟前置++区分,强行增加一个int形参,够成重载区分Date operator++(int);Date operator--(int);Date& operator--();// d1 - d2int operator-(const Date& d) const;// 本质就是inlineint GetMonthDay(int year, int month) const{assert(month > 0 && month < 13);static int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return monthDays[month];}void Print() const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};

构造函数和打印函数

函数声明写到Date.h文件中
函数定义写到Date.cpp 中
🗨️Date.h

#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public:// 全缺省构造函数Date(int year = 1, int month = 1, int day = 1);// 打印函数void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};

🗨️Date.cpp

#include"Date.h"// 缺省值在声明和定义中不能同时出现
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}

运行结果

在这里插入图片描述

在上面的代码中,构造函数我们使用全缺省,在调用的时候给了指定日期,通过打印函数把日期打印出来,这里的打印函数可以用const来修饰,const修饰成员函数,不能修改里面状态,而构造函数需要修改成员变量,所以不能加const。

获取日期并判断日期是否合法

比如说,我输入日期:
在这里插入图片描述
我们大家都知道,这日期哪来的13月啊,哪来的32天?是不是很离谱,是不是相当的不合理😅😅😅
所以我们设计一个自动获取日期天数并帮助我们判断该日期是否合法的函数功能。
获取天数int GetMonthDay 我们将该函数封装在类内,方便访问私有成员,提高效率。

注意:内联函数不要声明和定义分离!否则会出现链接错误,所以我们定义在类内

	int GetMonthDay(int year, int month) const{assert(month > 0 && month < 13);static int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 判断是否为闰年// 非整百年:能被4整除而不能被100整除的为闰年// 整百年:能被400整除的是闰年。if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return monthDay[month];}

我们将数组设置成13,因为数组下标是从0开始访问的,这样设方便我们返回时直接返回月份。

判断日期是否有效
月数:小于等于0或者大于12就无效
天数:可以依靠我们刚刚写的GetMonthDay函数,获取不同月份的天数,再去判断是否有效。

bool Date::CheckInvalid() const
{if (_year <= 0 || _month < 1 || _month>12 || _day<1 || _day>GetMonthDay(_year, _month)){return false;}else{return true;}
}

利用该函数每次构造日期判断日期是否合法。

Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;if (!CheckInvalid()){cout << "构造非法日期" << endl;}
}

测试:

在这里插入图片描述

日期类的拷贝构造和析构我们可以不写,让编译器自己生成就行了。

日期类的大小比较关系

日期类的大小关系看着挺多,实际上有些是可以复用的,实现了两个剩下的都可以复用
比较日期类的大小是不会修改传入对象的值的,所以我们把比较大小关系的成员函数都加上const修饰

<运算符重载 判断小于

先比较年是否小于,再判断月是否小于,最后判断日是否小于,其中一条满足则返回真true,反之返回假false。
Date.h

	bool operator<(const Date& d) const;

Date.cpp

// d1 < d2
bool Date::operator<(const Date& d) const
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){if (_day < d._day){return true;}}}return false;
}

运行结果

在这里插入图片描述

==运算符重载 判断相等

判断年月日是否都相等
Date.h

	bool operator==(const Date& d) const;

Date.cpp

// d1 == d2
bool Date::operator==(const Date& d) const
{return _year == d._year&& _month == d._month&& _day == d._day;
}

运行结果

在这里插入图片描述

<=运算符重载 判断小于等于

小于等于,即小于或等于,两者满足一个即可
这里就可以展现出复用的魅力了,已知我们已经实现了小于和等于,那小于或等于就不用自己实现了,直接复用
Date.h

bool operator<=(const Date& d) const;

Date.cpp

// d1 <= d2
bool Date::operator<=(const Date& d) const
{return *this < d || *this == d;
}

运行结果

在这里插入图片描述

>运算符重载 判断大于

你也可以用判断语句 if else if 来判断 但是这样太矬了,我们已经实现了小于等于了,那大于不就是非大于等于吗,继续复用!能坐着咱绝不站着🏄‍♀️
Date.h

	bool operator>(const Date& d) const;

Date.cpp

// d1 > d2
bool Date::operator>(const Date& d) const
{return !(*this <= d);
}

运行结果

在这里插入图片描述

>= 运算符重载 判断大于等于

大于等于,即大于或者等于,两者满足一个即可,或者直接非小于(!<)
Date.h

	bool operator>=(const Date& d) const;

Date.cpp
以下两种方法都可

bool Date::operator>=(const Date& d) const
{return *this > d || *this == d;
}

or

// d1 >= d2
bool Date::operator>=(const Date& d) const
{return !(*this < d);
}

运行结果

在这里插入图片描述

!= 运算符重载 不等于

字面意思很好理解,我们实现了等于,直接判断不等于即可
Date.h

	bool operator!=(const Date& d) const;

Date.cpp

// d1 != d2
bool Date::operator!=(const Date& d) const
{return !(*this == d);
}

运行结果

在这里插入图片描述

日期类计算

我们认为,日期+日期是没有意义的,但是+天数就很有意义了,假设我们想计算当前日期+100天之后的日期,+1000天呢何年何月何日?我们下面就来实现这个功能。

日期+=天数

+=运算符重载
在这里插入图片描述
由上图可见,无脑把天数叠上去肯定是不合理的,这里需要用到我们上面实现过的函数 GetMonthDay 了
思路:先将天数加到日(day)上面去,再判断是否合法,是否超出该月的天数,若不合法,则不断调整,直到合法为止。
调整日期步骤:
1.日+天数,若日超出当前月的天数,则日-当前月的天数,然后月+1;
2.若月加满,即超出12,则年+1,然后月重新置为1;
3.不断执行以上步骤进行调整,直到日期合法;
Date.h

	Date& operator+=(int day);

Date.cpp

// d1 += 100
Date& Date::operator+=(int day)
{// 直接加上去,后面再判断_day += day;// 若_day 大于 当前月份的天数,则进循环进行调整while (_day > GetMonthDay(_year, _month)){// _day减去当前月的天数_day -= GetMonthDay(_year, _month);++_month;// 月数+1;// 若月数溢出if (_month == 13){++_year;// 年数+1_month = 1;// 月数置为1}}return *this;
}

运行结果

注意:因为我们传引用返回,传的是d1的别名,实际上我们+=的是d1本身,d1原始值会发生改变,如下测试样例实际上是先加上了10,再把+10后的结果+100,这和我们接下来要讲的+是不一样的。

在这里插入图片描述

验证:此时d1原始数据发生改变

在这里插入图片描述

日期+天数

+运算符重载
对于+运算符来说,我们可以复用刚刚实现的operator+=运算符。
方法一:
先看结果:
Date.h

	Date operator+(int day) const;

Date.cpp

Date Date::operator+(int day) const
{Date tmp = *this;// 拷贝构造,返回tmptmp += day;// 复用operator+=return tmp;
}

运行结果

这里得注意,虽然我们对天数进行了加,并且返回的是加之后的值,但是d1本身并不会发生改变,这便是与+=运算符不同的地方,由代码可见,我们创建了个Date类的临时变量tmp,所以我们改变的是临时变量,并返回临时变量,这里我们还可以用const来修饰一下函数,防止内部改变this指针的指向。
在这里插入图片描述
对于+=和+,这里我们是先实现+=后实现+的,当然也可以先实现+后实现+=,它们有什么区别吗?
实现方法是类似的
我们简单看一下:
方法二:
Date.cpp

// d1 + 100
Date Date::operator+(int day) const
{// Date tmp(*this)Date tmp = *this;// 拷贝构造tmp._day += day;while (tmp._day > GetMonthDay(tmp._year, tmp._month)){tmp._day -= GetMonthDay(tmp._year, tmp._month);++tmp._month;if (tmp._month == 13){++tmp._year;tmp._month = 1;}}return tmp;
}

Date.cpp

Date& Date::operator+=(int day)
{*this = *this + day;return *this;
}

区别:
在这里插入图片描述

日期-=天数

和+=思路一样的,先用日减去需要减的天数day,再判断结果是否合法,若不合法,则进行调整,直到合法为止
步骤:
1若减完结果得负,则像月借,即月-1;
2.如果月减到0,则像年借,年-1;
3.日加上借的天数
4.重复以上步骤,直到日期合法为止;
Date.h

	Date& operator-=(int day);

Date.cpp

// d1 -= 100
Date& Date::operator-=(int day)
{_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}

运行结果

-=和+=一样的会改变d1本身,即改变原始值

在这里插入图片描述

日期-天数

Date.h

	Date operator-(int day) const;

Date.cpp

// d1 -100
Date Date::operator-(int day) const
{Date tmp = *this;tmp -= day;return tmp;
}

运行结果

在这里插入图片描述
注意:-=运算符的重载采用了引用返回,但是-运算符重载的返回却只能是传值返回,因为-运算符重载函数中的tmp对象出了作用域被销毁了,所以不能用引用返回。

前置++

我们可以服用+=运算符的重载
因为前置++返回的是++之后的值,所以我们使用引用返回
加不加引用就取决于它出了作用域还在不在
Date.h

	Date& operator++();

Date.cpp

// 前置++  ——》d.operator++()
Date& Date::operator++()
{*this += 1;return *this;
}

因为是复用+=,所以++的值就是this,直接返回this即可

运行结果

在这里插入图片描述

后置++

前置++和后置++都operator++,那要怎么让编译器方便识别它们呢,它怎么知道到底是前置++还是后置++。
这里我们要做特殊处理:解决语法逻辑自洽,自相矛盾问题
为了跟前置++区分,强行增加了一个int形参,构成重载区分
Date.h

	Date operator++(int);

Date.cpp

// 后置++
Date Date::operator++(int)
{// Date tmp(*this) 为了能返回++之前的值,所以拷贝构造d1;Date tmp = *this;*this += 1; // 复用+= ,return tmp;
}

运行结果

在这里插入图片描述注意:后置++也是需要返回加之前的值,所以我们用tmp保存之前的值,然后再+1,最后返回tmp,因为tmp是临时对象,出了作用域销毁了,所以后置++只能使用传值返回,前置++可以使用引用返回

前置–

前置–和前置++是一模一样的,参照前置++
Date.h

	// 前置--Date& operator--();

Date.cpp

// --d1
Date& Date::operator--()
{*this -= 1;return *this;
}

后置–

后置–和后置++一样的
Date.h

	// 后置--Date operator--(int);

Date.cpp

// d1--
Date Date::operator--(int)
{Date tmp = *this;tmp -= 1;return tmp;
}

日期-日期

计算两个传入日期相差的天数,一直让较小的日期++,一直加到和另一个日期相等即可,在加的过程中,小日期所加的天数,就是两个日期的差值
Date.h

	// d1 - d2int operator-(const Date& d) const;

Date.cpp

// d1 - d2
int Date::operator-(const Date& d) const
{// 立个flag,若左边的日期大于右边的日期,则返回真int flag = 1;Date max = *this;// 假设左边的日期大Date min = d;// 假设右边的日期小// 假设错误,进行更正if (*this < d){int flag = -1;max = d;// 令大的为右边的日期min = *this;// 小的为左边的日期}int n = 0;//记录加的天数while (min != max){++min;// 小日期++++n;//   总天数++}return n * flag;
}

运行结果

在这里插入图片描述

完整代码

Date.h

#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public:// 全缺省构造函数Date(int year = 1, int month = 1, int day = 1);Date(const Date& d);bool CheckInvalid() const;// 判断日期大小bool operator<(const Date& d) const;bool operator==(const Date& d) const;bool operator<=(const Date& d) const;bool operator>(const Date& d) const;bool operator>=(const Date& d) const;bool operator!=(const Date& d) const;// d1 += 100Date& operator+=(int day);Date operator+(int day) const;// d1 - 100Date& operator-=(int day);Date operator-(int day) const;// 前置++Date& operator++();// 后置++Date operator++(int);// 前置--Date& operator--();// 后置--Date operator--(int);// d1 - d2int operator-(const Date& d) const;// 本质就是内联inlineint GetMonthDay(int year, int month) const{assert(month > 0 && month < 13);static int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return monthDay[month];}// 打印函数void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};

Date.cpp

#include"Date.h"// 缺省值在声明和定义中不能同时出现
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;if (!CheckInvalid()){cout << "构造非法日期" << endl;}
}
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;//cout << "Date(const Date& d)" << endl;
}
// d1 < d2
bool Date::operator<(const Date& d) const
{if (_year < d._year){return true;}else if (_year == d._year){if (_month < d._month){return true;}else if (_month == d._month){if (_day < d._day){return true;}}}return false;
}
// d1 == d2
bool Date::operator==(const Date& d) const
{return _year == d._year&& _month == d._month&& _day == d._day;
}
// d1 <= d2
bool Date::operator<=(const Date& d) const
{return *this < d || *this == d;
}
// d1 > d2
bool Date::operator>(const Date& d) const
{return !(*this <= d);
}
// d1 >= d2
bool Date::operator>=(const Date& d) const
{//return !(*this < d);return *this > d || *this == d;
}
// d1 != d2
bool Date::operator!=(const Date& d) const
{return !(*this == d);
}// d1 += 100
Date& Date::operator+=(int day)
{// 直接加上去,后面再判断_day += day;// 若_day 大于 当前月份的天数,则进循环进行调整while (_day > GetMonthDay(_year, _month)){// _day减去当前月的天数_day -= GetMonthDay(_year, _month);++_month;// 月数+1;// 若月数溢出if (_month == 13){++_year;// 年数+1_month = 1;// 月数置为1}}return *this;
}
Date Date::operator+(int day) const
{Date tmp = *this;// 拷贝构造,返回tmptmp += day;// 复用operator+=return tmp;
}//Date Date::operator+(int day) const
//{
//	// Date tmp(*this)
//	Date tmp = *this;// 拷贝构造
//	tmp._day += day;
//	while (tmp._day > GetMonthDay(tmp._year, tmp._month))
//	{
//		tmp._day -= GetMonthDay(tmp._year, tmp._month);
//		++tmp._month;
//		if (tmp._month == 13)
//		{
//			++tmp._year;
//			tmp._month = 1;
//		}
//	}
//	return tmp;
//}
//Date& Date::operator+=(int day)
//{
//	*this = *this + day;
//	return *this;
//}// d1 -= 100
Date& Date::operator-=(int day)
{_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}
// d1 -100
Date Date::operator-(int day) const
{Date tmp = *this;tmp -= day;return tmp;
}// 前置++  ——》d.operator++()
Date& Date::operator++()
{*this += 1;return *this;
}
// d++ ->d.operator++(0)
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}
// --d1
Date& Date::operator--()
{*this -= 1;return *this;
}
// d1--
Date Date::operator--(int)
{Date tmp = *this;tmp -= 1;return tmp;
}
// d1 - d2
int Date::operator-(const Date& d) const
{// 立个flag,若左边的日期大于右边的日期,则返回真int flag = 1;Date max = *this;// 假设左边的日期大Date min = d;// 假设右边的日期小// 假设错误,进行更正if (*this < d){int flag = -1;max = d;// 令大的为右边的日期min = *this;// 小的为左边的日期}int n = 0;//记录加的天数while (min != max){++min;// 小日期++++n;//   总天数++}return n * flag;
}
bool Date::CheckInvalid() const
{if (_year <= 0 || _month < 1 || _month>12 || _day<1 || _day>GetMonthDay(_year, _month)){return false;}else{return true;}
}

Test.cpp

#include"Date.h"void Test1()
{Date d1(2024, 12, 13);Date d2(2024, 1, 15);cout << (d1 < d2) << endl;
}
void Test2()
{Date d1(2024, 1, 1);Date d2(2024, 1, 1);cout << (d1 == d2) << endl;Date d3(2024, 1, 2);cout << (d1 == d3) << endl;
}
void Test3()
{Date d1(2024, 6, 2);Date d2(2024, 6, 3);cout << (d1 <= d2) << endl;Date d3(2024, 6, 2);cout << (d1 <= d3) << endl;Date d4(2024, 6, 1);cout << (d1 <= d4) << endl;
}
// d1 > d2
void Test4()
{Date d1(2024, 6, 3);Date d2(2024, 6, 2);cout << (d1 > d2) << endl;Date d3(2024, 7, 1);cout << (d1 > d3) << endl;
}
// d1 >= d2
void Test5()
{Date d1(2024, 6, 1);Date d2(2024, 6, 1);cout << (d1 >= d2) << endl;Date d3(2024, 5, 20);cout << (d1 >= d3) << endl;Date d4(2024, 6, 3);cout << (d1 >= d4) << endl;
}
void Test6()
{Date d1(2024, 6, 1);Date d2(2024, 6, 2);cout << (d1 != d2) << endl;Date d3(2024, 6, 1);cout << (d1 != d3) << endl;
}void Test7()
{Date d1(2024, 6, 2);d1.Print();Date d2 = d1 += 10;d2.Print();Date d3 = d1 += 100;d3.Print();// 验证// 再次打印d1d1.Print();
}
void Test8()
{Date d1(2024, 6, 2);Date d2 = d1 += 10;d1.Print();d2.Print();
}
void Test9()
{Date d1(2024, 6, 1);Date d2 = d1 - 10;d2.Print();d1.Print();
}
// ++d1
void Test10()
{Date d1(2024, 6, 2);++d1;d1.Print();//d1++;//d1.operator++(10);//d1.Print();
}
void Test11()
{Date d1(2024, 6, 2);d1++;//d1.operator++(10);d1.Print();
}void Test12()
{Date d1(2024, 6, 2);Date d2(2024, 1, 2);cout << (d1 - d2) << endl;
}
int main()
{Test12	();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一维数组基础(题目+答案)

第1题 反向输出 时限&#xff1a;1s 空间&#xff1a;256m 输入n个数&#xff0c;要求程序按输入时的逆序把这n个数打印出来&#xff0c;已知整数不超过100个。也就是说&#xff0c;按输入相反顺序打印这n个数。 输入格式 第一行&#xff1a;一个整数n&#xff0c;代表…

成功解决“IndexError: pop index out of range”错误的全面指南

成功解决“IndexError: pop index out of range”错误的全面指南 引言 在Python编程中&#xff0c;处理列表&#xff08;list&#xff09;、双端队列&#xff08;deque&#xff09;或其他可迭代对象时&#xff0c;我们经常使用pop()方法来移除并返回指定索引处的元素。然而&am…

JD手机商品参数对比

前言废话 这不618快到了, 手机又有点问题了; 想换个手机, 但是手机不知道选哪个; 想着能不能对比一下, JD自带的对比只能两个商品不是很够用; 就尝试写一个 首先就是要把需要对比的商品都添加到关注商品里 然后搜索所需的信息, 找哪个接口获取的 然后查看分析html结构, xpa…

赢销侠的秘密武器:如何提升客户满意度?

在竞争激烈的商业战场上&#xff0c;客户满意度是企业能否长盛不衰的关键。它如同一面镜子&#xff0c;映照出企业的服务质量和产品实力。那么&#xff0c;赢销侠们是如何运用秘密武器来提升客户满意度的呢&#xff1f;本文将深入探讨这一课题&#xff0c;并揭示背后的策略与智…

生命在于学习——Python人工智能原理(3.1)

三、深度学习 &#xff08;一&#xff09;深度学习的概念 1、深度学习的来源 深度学习的概念来源于人工神经网络&#xff0c;所以又称深度神经网络。 人工神经网络主要使用计算机的计算单元和存储单元模拟人类大脑神经系统中大量的神经细胞&#xff08;神经元&#xff09;通关…

06.持久化存储

6.持久化存储 pv: persistent volume 全局的资源 pv&#xff0c;node pvc: persistent volume claim 局部的资源&#xff08;namespace&#xff09;pod&#xff0c;rc&#xff0c;svc 6.1:安装nfs服务端(192.168.111.11) yum install nfs-utils.x86_64 -y mkdir /data vim /…

MyBatis 的在使用上的注意事项及其辨析

1. MyBatis 的在使用上的注意事项及其辨析 文章目录 1. MyBatis 的在使用上的注意事项及其辨析2. 准备工作3. #{ } 与 ${ } 的区别和使用3.1 什么情况下必须使用 ${ }3.1.1 拼接表名3.1.2 批量删除3.1.3 模糊查询3.1.3.1 使用 ${ }的方式3.1.3.2 使用 #{ } 的方式 4. typeAlias…

风景的短视频一分钟:成都科成博通文化传媒公司

风景的短视频一分钟&#xff1a;时光凝固的画卷 在快节奏的现代生活中&#xff0c;我们常常被繁忙和琐碎所困扰&#xff0c;渴望在喧嚣中找到一丝宁静与美好。而风景的短视频&#xff0c;正是这样一份能够让我们在短时间内沉浸于自然之美的奇妙礼物。成都科成博通文化传媒公司…

牛客BM85 验证IP地址【中等 字符串 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880 https://www.lintcode.com/problem/1222/description 思路 直接模拟&#xff0c;注意IPv4,ipv6的条件Java代码 import java.util.*;public class Solution {/*** 验证IP地址…

关于IDEA创建Maven一直爆红无法下载的问题

你能看到这我就知道你肯定已经试过了网上的很多方法了&#xff0c;我之前也是&#xff0c;试过了很多一直无法正常下载&#xff0c;我也是找人给 线下看了看解决了&#xff0c;我总结一下从头到尾排除问题&#xff0c;试到最后要是还解决不了你直接私信我&#xff0c;我给你看看…

路由策略实验1

先把地址全部配通 对R1 对R2 对R4 对R3 对R5 对R6 对R7 然后起路由协议 对R1 对R2 对R3 对R4 对R5 对R6 对R7

C++17之std::void_t

目录 1.std::void_t 的原理 2.std::void_t 的应用 2.1.判断成员存在性 2.1.1.判断嵌套类型定义 2.1.2 判断成员是否存在 2.2 判断表达式是否合法 2.2.1 判断是否支持前置运算符 2.2.3 判断两个类型是否可做加法运算 3.std::void_t 与 std::enable_if 1.std::void_t 的…

猫头虎分享已解决Bug || **Eslint插件安装问题Unable to resolve eslint-plugin-猫头虎

猫头虎分享已解决Bug || **Eslint插件安装问题Unable to resolve eslint-plugin-猫头虎 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的…

将 py 文件编译成 pyd 文件

文章目录 一、简介1.1、Python中的文件类型&#xff1a;.py .pyc .pyd1.2、基本原理1.2.1、函数详解&#xff1a;Extension() —— 用于定义扩展模块&#xff08;C/C 扩展&#xff09;的类1.2.2、函数详解&#xff1a;setup() —— 用于配置和构建包的函数 二、构建过程2.0、…

百度文心一言API批量多线程写文章软件-key免费无限写

百度文心大模型的两款主力模型ENIRE Speed、ENIRE Lite全面免费&#xff0c;即刻生效。 百度文心大模型的两款主力模型 这意味着&#xff0c;大模型已进入免费时代&#xff01; 据了解&#xff0c;这两款大模型发布于今年 3 月&#xff0c;支持 8K 和 128k 上下文长度。 ER…

Java集合面试题(概述,list,Map)

一个常见的"fail-safe"集合例子是CopyOnWriteArrayList。这个集合在每次修改时都会复制当前的数组&#xff0c;修改操作在新数组上进行&#xff0c;而遍历操作则在旧数组上进行。这样&#xff0c;即使在遍历过程中进行了修改&#xff0c;也不会影响遍历的进行。 插入…

车载诊断内容汇总(培训+视频)

车载诊断内容汇总 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c…

pyopengl 立方体 正投影,透视投影

目录 顶点和线的方式 划线的方式实现: 顶点和线的方式 import numpy as np from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from OpenGL.GL import * from OpenGL.GLU import * import sys…

Java大文件上传、分片上传、多文件上传、断点续传、上传文件minio、分片上传minio等解决方案

一、上传说明 文件上传花样百出&#xff0c;根据不同场景使用不同方案进行实现尤为必要。通常开发过程中&#xff0c;文件较小&#xff0c;直接将文件转化为字节流上传到服务器&#xff0c;但是文件较大时&#xff0c;用普通的方法上传&#xff0c;显然效果不是很好&#xff0c…

【Unity脚本】修改游戏对象的活动状态

【知识链】Unity -> Unity脚本 -> 游戏对象 -> 活动状态【摘要】本文介绍了如何通过编辑器和脚本来访问游戏对象的活动状态&#xff0c;并给出具体的场景示例。 文章目录 第一章 引言第二章 在编辑器中设置活动状态2.1. 在编辑器中设置活动状态2.1.1. 停用游戏对象2.…