C++:继承与多态
目录
- 一、继承访问权限测试
- 1.public继承
- 2.protected继承
- 3.private继承
- 4.总结
- 二、友元类继承测试
- 1.三种友元方式
- 2.友元继承测试
- 三、多态性的综合运用
- 1.一般多态性函数
- 2.特殊多态性函数
- 3.析构函数的多态性
- 4.多继承
- 四、矢量图设计
- 1.main.cpp
- 2.Draw.h
- 3.Draw.cpp
一、继承访问权限测试
设计类A具有public, protected, private等不同属性的成员函数或变量;
类B通过public, protected, private等不同方式继承A,在类B的成员函数中测试访问A的成员函数或变量;
在类B中添加public, protected, private等不同属性的成员函数或变量,在外部测试访问B的各个成员函数或变量;
B以private方式继承A,尝试把A中的部分public成员提升为public。
// 基类Person
class Person
{
public:Person();string m_strName;
protected:string m_strSex;
private:int m_nAge;
};
// 测试Person
void TestPerson();
Person::Person()
{// 成员函数可以访问类里面的所有变量m_strName = "";m_strSex = "boy";m_nAge = 18;
}
void TestPerson()
{Person perObj;//外部可以访问public关键字修饰的公有成员perObj.m_strName = "Luoxiaobin";//外部不能访问protected和private修饰的成员//perObj.m_strSex = "B";//perObj.m_nAge = 18;}
1.public继承
class Student: public Person
{
public:void SetSex(string strSex=""){m_strName = "";m_strSex = strSex;
// 可以访问基类中为public和protected的成员变量
// m_nAge = 0;//不能访问
// 在继承类的成员函数内部只能访问父类的public和protected属性}
// inline string GetSex();//显式内联函数string GetSex()//隐式内联函数{Person::SetSex();//调用父类Person的SexSex()函数SetSex("");//调用子类Student的SexSex()函数return m_strSex;}};
Student stuObj;
string strSex = stuObj.GetSex();// GetSex()函数必须放在头文件中,否则编译出错
stuObj.m_strName = "LuoXiaobin";
2.protected继承
class Teacher: protected Person
{
public:void SetSex(string strSex=""){m_strName = "";m_strSex = strSex;
// m_nAge = 0;//不能访问
// 在继承类的成员函数内部只能访问父类的public和protected属性
//无论子类是以public,protected还是private的方式继承父类,
//对于子类成员函数内部的访问是不变的,即都可以访问public和protected属性,而外部访问则不同}};
Teacher teacher;
teacher.SetSex();// 继承之后SetSex()为protected属性,在外部不能访问该属性
// 当父类和自身都有同名的SetSex函数时,调用的是自身内部的函数
// 不论父类的SetSex函数为哪种属性,都是调用自身Teacher类的SetSex函数
3.private继承
class Pupil: private Person
{
public:using Person::m_strName;using Person::m_strSex;
// 通过private继承之后,原本为public的m_strName变为private,
// 原本为protected的m_strSex也变为private,可以通过using提升使得可以访问
// using Person::m_nAge;
// 继承类只能访问基类的public属性和private属性,所以不能通过using提升m_nAge的属性访问它string & GetName(){return m_strName;}void SetSex(string strSex=""){m_strName = "";m_strSex = strSex;
// m_nAge = 0;}
};
Pupil pupil;
pupil.GetName() = "";
pupil.m_strName = "";
pupil.m_strSex = "";
// pupil.m_nAge = 18;
4.总结
public、protected、private 指定继承方式:
不同的继承方式会影响基类成员在派生类中的访问权限。
-
public继承方式
基类中所有 public 成员在派生类中为 public 属性;
基类中所有 protected 成员在派生类中为 protected 属性;
基类中所有 private 成员在派生类中不能使用。 -
protected继承方式
基类中的所有 public 成员在派生类中为 protected 属性;
基类中的所有 protected 成员在派生类中为 protected 属性;
基类中的所有 private 成员在派生类中不能使用。 -
private继承方式
基类中的所有 public 成员在派生类中均为 private 属性;
基类中的所有 protected 成员在派生类中均为 private 属性;
基类中的所有 private 成员在派生类中不能使用。
通过上面的分析可以发现:
-
基类成员在派生类中的访问权限不得高于继承方式中指定的权限。也就是说,继承方式中的 public、protected、private 是用来指明基类成员在派生类中的最高访问权限的。
-
不管继承方式如何,基类中的 private 成员在派生类中始终不能使用(不能在派生类的成员函数中访问或调用)。
-
如果希望基类的成员能够被派生类继承并且毫无障碍地使用,那么这些成员只能声明为 public 或 protected;只有那些不希望在派生类中使用的成员才声明为 private。
-
如果希望基类的成员既不向外暴露(不能通过对象访问),还能在派生类中使用,那么只能声明为 protected。
注意,我们这里说的是基类的 private 成员不能在派生类中使用,并没有说基类的 private 成员不能被继承。实际上,基类的 private 成员是能够被继承的,并且(成员变量)会占用派生类对象的内存,它只是在派生类中不可见,导致无法使用罢了。private 成员的这种特性,能够很好的对派生类隐藏基类的实现,以体现面向对象的封装性。
改变访问权限:
using 只能改变基类中 public 和 protected 成员的访问权限,不能改变 private 成员的访问权限,因为基类中 private 成员在派生类中是不可见的,根本不能使用,所以基类中的 private 成员在派生类中无论如何都不能访问。
二、友元类继承测试
1.三种友元方式
class Person
{
public:Person();
private:int m_nAge;friend class A;// 第一种方式---友元成员函数
// friend void A::TestFriend(Person & per);// 只给某个类的成员开权限// 第二种方式---友元全局函数friend void TestFriendFun(Person & per){per.m_nAge = 10;}// 第三种方式---友元类friend class Student;//Studnet类可以访问所有Person的成员函数
// friend class Student::GetAge();};
2.友元继承测试
(1)友元类不能传递:基类Person友元给派生类Student,派生类Lecturer继承Student类,但是Lecture依然不能访问Person的成员。
class Person
{
private:int m_nAge;// 第三种方式---友元类friend class Student;//Studnet类可以访问所有Person的私有成员函数
};
class Lecturer : public Student
{
public:int GetAge(){
// m_nAge = 10;
// 报错:m_nAge是Person类的private成员。即友元类不能传递m_strName = "";}
};
(2)被友元的类不能访问到基类的派生类新增的成员变量
class Person
{
private:int m_nAge;friend class A;// 基类Person友元给整个类A
};
class A
{
public:void TestFriend(Person & per);void TestFriend(Student & per);
};
class Student: public Person
{
private:int m_nNo;
};void A::TestFriend(Student & per)
{per.m_nAge = 10;// 可以访问基类Person的private成员per.m_nNo = 100;// 不能访问派生类Student的private成员// m_nNo是派生类Student的私有成员// 同理,只要是派生类中新增的成员变量都不能访问到
}
(3)友元给特定类的特定成员:只有该成员才能访问基类的成员,其他类和该类的其他成员都不能访问。
class A
{
public:void TestFriend(Person & per);void TestFriendA(Person & per);
};
// 基类Person
class Person
{friend void A::TestFriend(Person & per);// 只给某个类的特定成员开权限
};void A::TestFriend(Person & per)
{per.m_nAge = 10;// 只有A类的TestFriend才能访问m_nAge
}
void A::TestFriendA(Person & per)
{per.m_nAge = 10;// A类里的该成员没有权限访问基类Person的成员
}
三、多态性的综合运用
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
1.一般多态性函数
#include <iostream>
using namespace std;class Shape
{protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}int area(){cout << "Parent class area :" <<endl;return 0;}
};
class Rectangle: public Shape{public:Rectangle( int a=0, int b=0):Shape(a, b) { }int area (){cout << "Rectangle class area :" <<endl;return (width * height);}
};
class Triangle: public Shape{public:Triangle( int a=0, int b=0):Shape(a, b) { }int area (){cout << "Triangle class area :" <<endl;return (width * height / 2);}
};
#include "person.h"int main()
{Shape *shape;Rectangle rec(10,7);Triangle tri(10,5);// 存储矩形的地址shape = &rec;// 调用矩形的求面积函数 areashape->area();// 存储三角形的地址shape = &tri;// 调用三角形的求面积函数 areashape->area();return 0;
}
输出结果:
结果分析:调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。
改进:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area()//在基类中添加virtual{cout << "Parent class area :" <<endl;return 0;}
};
输出结果:
结果分析:改进后,编译器看的是指针内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,就可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
虚函数:虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
纯虚函数:你可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是你在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
我们可以把基类中的虚函数 area() 改写如下:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0;// = 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数。
};
2.特殊多态性函数
实例:
#define PERSON_H
#include <iostream>
using namespace std;//基类People
class People{
public:People(char *name, int age);void display();
protected:char *m_name;int m_age;
};
People::People(char *name, int age): m_name(name), m_age(age){}
void People::display(){cout<<m_name<<"今年"<<m_age<<"岁了,是个无业游民。"<<endl;
}
//派生类Teacher
class Teacher: public People{
public:Teacher(char *name, int age, int salary);void display();
private:int m_salary;
};
Teacher::Teacher(char *name, int age, int salary): People(name, age), m_salary(salary){}
void Teacher::display(){cout<<m_name<<"今年"<<m_age<<"岁了,是一名教师,每月有"<<m_salary<<"元的收入。"<<endl;
}// 主函数
#include "person.h"
#include <iostream>
using namespace std;int main(){People *p = new People("王志刚", 23);p -> display();p = new Teacher("赵宏佳", 45, 8200);p -> display();return 0;
}
输出结果:
结果分析:当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数,导致输出结果不伦不类(赵宏佳本来是一名老师,输出结果却显示人家是个无业游民),不符合我们的预期。换句话说,通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。
解决:使用虚函数。
在基类Person和派生类Teacher中声明display()为虚函数:
virtual void display(); //声明为虚函数
输出结果:
总结:有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式。
C++提供多态的目的是:可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,我们只能访问成员变量。虚函数是根据指针的指向来调用的,指针指向哪个类的对象就调用哪个类的虚函数。
3.析构函数的多态性
我们知道,有时会让一个基类指针指向用 new 运算符动态生成的派生类对象;同时,用 new 运算符动态生成的对象都是通过 delete 指向它的指针来释放的。如果一个基类指针指向用 new 运算符动态生成的派生类对象,而释放该对象时是通过释放该基类指针来完成的,就可能导致程序不正确。
实例:
class CShape //基类
{
public:~CShape() { cout << "CShape::destrutor" << endl; }
};
class CRectangle : public CShape //派生类
{
public:int w, h; //宽度和高度~CRectangle() { cout << "CRectangle::destrutor" << endl; }
};
// 主函数
int main()
{CShape* p = new CRectangle;delete p;return 0;
}
输出结果:
结果分析:delete p;只引发了 CShape 类的析构函数被调用,没有引发 CRectangle 类的析构函数被调用。这是因为该语句是静态联编的,编译器编译到此时,不可能知道此时 p 到底指向哪个类型的对象,它只根据 p 的类型是 CShape * 来决定应该调用 CShape 类的析构函数。
解决方法:在析构函数前加 virtual 关键字,将其声明为虚函数。
class CShape{
public:virtual ~CShape() { cout << "CShape::destrutor" << endl; }
};
输出结果:
结果分析:说明 CRetangle 类的析构函数被调用了。实际上,派生类的析构函数会自动调用基类的析构函数。
只要基类的析构函数是虚函数,那么派生类的析构函数不论是否用virtual关键字声明,都自动成为虚析构函数
4.多继承
多继承即一个子类可以有多个父类,它继承了多个父类的特性。
C++ 类可以从多个类继承成员,语法如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};
其中,访问修饰符继承方式是 public、protected 或 private 其中的一个,用来修饰每个基类,各个基类之间用逗号分隔。
实例:
// 基类 Shape
class Shape
{public:void setWidth(int w){width = w;}void setHeight(int h){height = h;}protected:int width;int height;
};// 基类 PaintCost
class PaintCost
{public:int getCost(int area){return area * 70;}
};// 派生类
class Rectangle: public Shape, public PaintCost
{public:int getArea(){return (width * height);}
};
// 主函数
int main(void)
{Rectangle Rect;int area;Rect.setWidth(5);Rect.setHeight(7);area = Rect.getArea();// 输出对象的面积cout << "Total area: " << Rect.getArea() << endl;// 输出总花费cout << "Total paint cost: $" << Rect.getCost(area) << endl;return 0;
}
输出结果:
多继承时很容易产生命名冲突,比如典型的是菱形继承,如下图所示:
类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,一份来自 A–>B–>D 这条路径,另一份来自 A–>C–>D 这条路径。
在一个派生类中保留间接基类的多份同名成员,虽然可以在不同的成员变量中分别存放不同的数据,但大多数情况下这是多余的:因为保留多份成员变量不仅占用较多的存储空间,还容易产生命名冲突。假如类 A 有一个成员变量 a,那么在类 D 中直接访问 a 就会产生歧义,编译器不知道它究竟来自 A -->B–>D 这条路径,还是来自 A–>C–>D 这条路径。下面是菱形继承的具体实现:
//间接基类A
class A{
protected:int m_a;
};
//直接基类B
class B: public A{
protected:int m_b;
};
//直接基类C
class C: public A{
protected:int m_c;
};
//派生类D
class D: public B, public C{
public:void seta(int a){ m_a = a; } //命名冲突void setb(int b){ m_b = b; } //正确void setc(int c){ m_c = c; } //正确void setd(int d){ m_d = d; } //正确
private:int m_d;
};
int main(){D d;return 0;
}
类D代码试图直接访问成员变量 m_a,结果发生了错误,因为类 B 和类 C 中都有成员变量 m_a(从 A 类继承而来),编译器不知道选用哪一个,所以产生了歧义。
为了消除歧义,我们可以在 m_a 的前面指明它具体来自哪个类:
void seta(int a){ B::m_a = a; }
这段代码表示使用 B 类的 m_a。当然也可以使用 C 类的:
void seta(int a){ C::m_a = a; }
虚继承:解决多继承时的命名冲突和冗余数据问题,使得在派生类中只保留一份间接基类的成员。
实例:
//间接基类A
class A{
protected:int m_a;
};
//直接基类B
class B: virtual public A{ //虚继承
protected:int m_b;
};
//直接基类C
class C: virtual public A{ //虚继承
protected:int m_c;
};
//派生类D
class D: public B, public C{
public:void seta(int a){ m_a = a; } //正确void setb(int b){ m_b = b; } //正确void setc(int c){ m_c = c; } //正确void setd(int d){ m_d = d; } //正确
private:int m_d;
};
int main(){D d;return 0;
}
该实例使用虚继承重新实现了上图所示的菱形继承,这样在派生类 D 中就只保留了一份成员变量 m_a,直接访问就不会再有歧义了。
虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class),本例中的 A 就是一个虚基类。在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。
四、矢量图设计
EasyX 是针对 C/C++ 的图形库,安装后可以帮助使用C/C++语言快速上手图形编程。引用graphics的头文件后即可编程。
1.main.cpp
(1).窗口设计
//图形画布基础设置
initgraph(640, 480);// 创建窗口(宽度,高度)
setbkcolor(WHITE); // 设置背景颜色
delay_ms(0);//将程序的执行暂停一段时间(毫秒)
setcolor(BLACK);//该方法用于设置画笔的颜色
settextstyle(16, 0, _T("Consolas"));//为图形输出设置当前的文本属性
setbkmode(TRANSPARENT);//设置指定DC的背景混合模式,背景混合模式用于与文本,填充画刷和当画笔不是实线时。
//enter+左击-->新建矩形");
//enter+右击-->新建三角形");
//enter+滚轮中间-->新建组合图形//ctrl+左击-->复制图形");
//ctrl+右击-->粘贴图形");//vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含对应头文件
vector<Draw*>shapes;
vector<Draw*>shapestmp;// push_back:在vector类中作用为在vector尾部加入一个数据。
shapes.push_back(new CTriangle(CPoint(320, 320), CPoint(250, 340), CPoint(340, 450)));
//shapes.push_back(new CTriangle(CPoint(10, 10), CPoint(150, 10), CPoint(150, 150)));
shapes.push_back(new CRect(CPoint(200, 200), CPoint(300, 300)));
shapes.push_back(new Comgraphics(CRect(CPoint(250, 50))));
(2).鼠标事件
//移动
bool move_flag = false;
bool copy_flag = false;
bool redraw = true;
//鼠标点击时记录它的坐标
int clickX, clickY;
int copyX, copyY;
int checkedid = -1;
int copyid = -1;for (; is_run(); delay_fps(60)) {while (mousemsg()) {//保存鼠标消息的结构体mouse_msg msg = getmouse();//获取一个鼠标消息,如果当前鼠标消息队列中没有,就一直等待//判断鼠标的移动if (msg.is_move()) {if (checkedid != -1) {if (move_flag) {shapes[checkedid]->Move(msg.x - clickX, msg.y - clickY);}}clickX = msg.x;clickY = msg.y;redraw = true;}// 判断鼠标左键else if (msg.is_left()) {// 判断鼠标左键是否按下if (msg.is_down()) {clickX = msg.x;clickY = msg.y;CPoint pt = CPoint(clickX, clickY);int isIn = 0;for (int i = 0; i < shapes.size(); i++) {if (shapes[i]->ptIn(pt)) {isIn = 1;//如果鼠标在图形区域内就设置移动的flag为truemove_flag = true;checkedid = i;redraw = true;break;}}if (isIn == 0)checkedid = -1;}else {move_flag = false;}}}// 重新绘图if (redraw) {redraw = false;cleardevice();for (int i = 0; i < shapes.size(); i++) {if (i == checkedid)shapes[i]->DrawColor();elseshapes[i]->Draw();}}while (kbmsg()) {key_msg msgk = getkey();if (msgk.key == key_enter && msgk.msg == key_msg_down) {mouse_msg msgm = getmouse();if (msgm.is_left()) {// 判断鼠标左键是否按下if (msgm.is_down()) {shapes.push_back(new CRect(CPoint(msgm.x, msgm.y)));redraw = true;}}if (msgm.is_right()) {// 判断鼠标右键是否按下if (msgm.is_down()) {shapes.push_back(new CTriangle(CPoint(msgm.x, msgm.y)));redraw = true;}}if (msgm.is_mid()) {CRect r1 = CRect(CPoint(msgm.x, msgm.y));// 判断鼠标中键是否按下if (msgm.is_down()) {shapes.push_back(new Comgraphics(r1));redraw = true;}}}if (msgk.key == key_control && msgk.msg == key_msg_down) {mouse_msg msgm = getmouse();if (msgm.is_left()) {// 判断鼠标左键是否按下if (msgm.is_down()) {copyX = msgm.x;copyY = msgm.y;CPoint pt = CPoint(copyX, copyY);for (int i = 0; i < shapes.size(); i++) {if (shapes[i]->ptIn(pt)) {//如果鼠标在图形区域内就设置移动的flag为truecopy_flag = true;copyid = i;break;}}}}if (msgm.is_right()) {// 判断鼠标右键是否按下if (msgm.is_down()) {if (copy_flag == true) {shapes.push_back(&(shapes[copyid]->Clone())->Move(msgm.x - copyX, msgm.y - copyY));redraw = true;}}}}}
}
closegraph();// 关闭窗口
return 0;
2.Draw.h
class CPoint;
class CRect;
class Draw
{
public:Draw();Draw(const Draw& shape);virtual ~Draw();virtual double GetArea() const;virtual bool ptIn(const CPoint& pt) const;virtual bool InRect(const CRect& rc) const;virtual void Draw() const;virtual void DrawColor();virtual Draw* Clone() const;virtual Draw& Move(int nOffsetX, int nOffsetY);protected:string m_sName;
};class CPoint :public Draw {
public:int m_nPosX;int m_nPosY;CPoint() {m_nPosX = 0;m_nPosY = 0;}CPoint(int nPosX, int nPosY);CPoint(const CPoint& pt);virtual ~CPoint();double GetArea() const;bool ptIn(const CPoint& pt) const;bool InRect(const CRect& rc) const;void Draw() const;void DrawColor();CPoint* Clone() const;CPoint& Move(int nOffsetX, int nOffsetY);
};
class CTriangle :virtual public Draw {
public:CTriangle() {}CTriangle(const CPoint& pt1, const CPoint& pt2, const CPoint& pt3);CTriangle(const CTriangle& rc);CTriangle(const CPoint& pt);virtual ~CTriangle();double GetArea() const;bool ptIn(const CPoint& pt) const;bool InRect(const CRect& rc) const;void Draw() const;void DrawColor();Draw* Clone() const;Draw& Move(int nOffsetX, int nOffsetY);CPoint m_pts[3];
};class CRect :virtual public Draw {
public:CRect() {}CRect(CPoint pt1, CPoint pt2);CRect(const CRect& rc);CRect(CPoint pt1);virtual ~CRect();double GetArea() const;bool ptIn(const CPoint& pt) const;bool InRect(const CRect& rc) const;void Draw() const;void DrawColor();Draw* Clone() const;Draw& Move(int nOffsetX, int nOffsetY);CPoint m_ptLT;CPoint m_ptBR;
};class Comgraphics :public CRect, public CTriangle {
public:Comgraphics(const CRect& pt1);Comgraphics(const Comgraphics& rc);Comgraphics(const CPoint pt1);virtual ~Comgraphics();double GetArea() const;bool ptIn(const CPoint& pt) const;bool InRect(const CRect& rc) const;void Draw() const;void DrawColor();Draw* Clone() const;Draw& Move(int nOffsetX, int nOffsetY);CPoint m_pt1;CPoint m_pt2;};
3.Draw.cpp
Draw::Draw()
{
}
Draw::Draw(const Draw& shape) {m_sName = shape.m_sName;
}
Draw::~Draw()
{
}
double Draw::GetArea() const {return 0;
}
bool Draw::ptIn(const CPoint& pt) const {return false;
}
bool Draw::InRect(const CRect& rc) const {return false;
}
void Draw::Draw() const
{
}
void Draw::DrawColor()
{
}
Draw* Draw::Clone() const {return new Draw(*this);
}
Draw& Draw::Move(int nOffsetX, int nOffsetY) {return *this;
}//CPoint
CPoint::CPoint(int nPosX, int nPosY) {m_nPosX = nPosX;m_nPosY = nPosY;
}
CPoint::CPoint(const CPoint& pt) {m_nPosX = pt.m_nPosX;m_nPosY = pt.m_nPosY;
}
CPoint::~CPoint() {//cout << "CPoint::~CPoint()\n";
}
double CPoint::GetArea() const {return 0;
}
bool CPoint::ptIn(const CPoint& pt) const {return false;
}
bool CPoint::InRect(const CRect& rc) const {return rc.ptIn(*this);
}
void CPoint::Draw() const {circle(m_nPosX, m_nPosY, 2);
}
void CPoint::DrawColor()
{
}
CPoint* CPoint::Clone() const {return new CPoint(*this);
}
CPoint& CPoint::Move(int nOffsetX, int nOffsetY) {m_nPosX += nOffsetX;m_nPosY += nOffsetY;return *this;
}//CTriangle
CTriangle::CTriangle(const CTriangle& tri) {for (int i = 0; i < 3; i++) {m_pts[i] = tri.m_pts[i];}
}
CTriangle::~CTriangle() {//cout << "CTriangle::~CTriangle()\n";
}
CTriangle::CTriangle(const CPoint& pt1, const CPoint& pt2, const CPoint& pt3) {m_pts[0] = pt1;m_pts[1] = pt2;m_pts[2] = pt3;
}
CTriangle::CTriangle(const CPoint& pt)
{CPoint* pt1 = new CPoint(pt.m_nPosX + 100, pt.m_nPosY + 90);CPoint* pt2 = new CPoint(pt.m_nPosX, pt.m_nPosY + 90);m_pts[0] = pt;m_pts[1] = *pt1;m_pts[2] = *pt2;
}Draw& CTriangle::Move(int nOffsetX, int nOffsetY) {for (int i = 0; i < 3; i++) {m_pts[i].Move(nOffsetX, nOffsetY);}return *this;
}
double CTriangle::GetArea() const {int x1, y1, x2, y2, x3, y3;x1 = m_pts[0].m_nPosX;y1 = m_pts[0].m_nPosY;x2 = m_pts[1].m_nPosX;y2 = m_pts[1].m_nPosY;x3 = m_pts[2].m_nPosX;y3 = m_pts[2].m_nPosY;double bottomLine = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));double verticalLine1 = abs((y1 - y2) * x3 - (x1 - x2) * y3 + (x1 - x2) * y2 - (y1 - y2) * x2);double verticalLine2 = sqrt(pow(y1 - y2, 2) + pow(x1 - x2, 2));double verticalLine = verticalLine1 / verticalLine2;return (verticalLine * bottomLine) / 2.0;
}
bool CTriangle::ptIn(const CPoint& pt) const {CTriangle c1 = CTriangle(m_pts[0], m_pts[1], pt);CTriangle c2 = CTriangle(m_pts[1], m_pts[2], pt);CTriangle c3 = CTriangle(m_pts[2], m_pts[0], pt);double totalArea = c1.GetArea() + c2.GetArea() + c3.GetArea();if (totalArea == this->GetArea())return true;elsereturn false;
}
bool CTriangle::InRect(const CRect& rc) const {return rc.ptIn(m_pts[0]) && rc.ptIn(m_pts[1]) && rc.ptIn(m_pts[2]);
}
void CTriangle::Draw() const {int poly[8] = { m_pts[0].m_nPosX ,m_pts[0].m_nPosY,m_pts[1].m_nPosX,m_pts[1].m_nPosY,m_pts[2].m_nPosX,m_pts[2].m_nPosY, m_pts[0].m_nPosX ,m_pts[0].m_nPosY };setfillcolor(RGB(0xFF, 0xFF, 0xFF));fillpoly(4, poly);
}
void CTriangle::DrawColor() {int poly[8] = { m_pts[0].m_nPosX ,m_pts[0].m_nPosY,m_pts[1].m_nPosX,m_pts[1].m_nPosY,m_pts[2].m_nPosX,m_pts[2].m_nPosY, m_pts[0].m_nPosX ,m_pts[0].m_nPosY };setfillcolor(RGB(0xFF, 0xA5, 0x00));fillpoly(4, poly);
}
Draw* CTriangle::Clone() const {return new CTriangle(*this);
}//CRect
CRect::CRect(CPoint pt1, CPoint pt2) {m_ptLT = CPoint(min(pt1.m_nPosX, pt2.m_nPosX), min(pt1.m_nPosY, pt2.m_nPosY));m_ptBR = CPoint(max(pt1.m_nPosX, pt2.m_nPosX), max(pt1.m_nPosY, pt2.m_nPosY));
}
CRect::CRect(const CRect& rc) {m_ptLT = rc.m_ptLT;m_ptBR = rc.m_ptBR;
}
CRect::CRect(CPoint pt1)
{m_ptLT = CPoint(pt1.m_nPosX, pt1.m_nPosY);m_ptBR = CPoint(pt1.m_nPosX + 100, pt1.m_nPosY + 100);
}
CRect::~CRect() {// cout << "CRect::CRect()\n";
}
double CRect::GetArea() const {return (m_ptBR.m_nPosX - m_ptLT.m_nPosX) * (m_ptBR.m_nPosY - m_ptLT.m_nPosY);
}
bool CRect::ptIn(const CPoint& pt) const {return (pt.m_nPosX >= m_ptLT.m_nPosX && pt.m_nPosX <= m_ptBR.m_nPosX) &&(pt.m_nPosY >= m_ptLT.m_nPosY && pt.m_nPosY <= m_ptBR.m_nPosY);
}
bool CRect::InRect(const CRect& rc) const {return rc.ptIn(m_ptLT) && rc.ptIn(m_ptBR);
}
void CRect::Draw() const {// 存储n个顶点的x,y坐标int pts[10] = { m_ptLT.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptLT.m_nPosY };// 绘制n个顶点的多边形,第一个参数必须要传入n+1,pts最后一个顶点坐标和第一个相同//drawpoly(5, pts);setfillcolor(RGB(0xFF, 0xFF, 0xFF));fillpoly(5, pts);
}
void CRect::DrawColor() {int pts[10] = { m_ptLT.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptLT.m_nPosY };// 绘制n个顶点的多边形,第一个参数必须要传入n+1,pts最后一个顶点坐标和第一个相同setfillcolor(RGB(0xFF, 0xA5, 0x00));fillpoly(5, pts);
}
Draw* CRect::Clone() const {return new CRect(*this);
}
Draw& CRect::Move(int nOffsetX, int nOffsetY) {m_ptLT.Move(nOffsetX, nOffsetY);m_ptBR.Move(nOffsetX, nOffsetY);return *this;}
//Comgraphics
Comgraphics::Comgraphics(const CRect& pt1) {m_pt1.m_nPosX = pt1.m_ptBR.m_nPosX;m_pt1.m_nPosY = pt1.m_ptLT.m_nPosY + (pt1.m_ptBR.m_nPosY - pt1.m_ptLT.m_nPosY) / 2;m_pt2.m_nPosX = pt1.m_ptLT.m_nPosX + (pt1.m_ptBR.m_nPosX - pt1.m_ptLT.m_nPosX) / 2;m_pt2.m_nPosY = pt1.m_ptBR.m_nPosY;m_ptLT = pt1.m_ptLT;m_ptBR = pt1.m_ptBR;}
Comgraphics::Comgraphics(const Comgraphics& rc) {m_pt1 = rc.m_pt1;m_pt2 = rc.m_pt2;m_ptBR = rc.m_ptBR;m_ptLT = rc.m_ptLT;
}
Comgraphics::Comgraphics(const CPoint pt1) {m_ptLT = CPoint(pt1.m_nPosX, pt1.m_nPosY);m_ptBR = CPoint(pt1.m_nPosX + 60, pt1.m_nPosY + 80);
}
Comgraphics::~Comgraphics() {cout << "Comgraphics::~Comgraphics()" << endl;}
double Comgraphics::GetArea() const {return 0.0;
}
bool Comgraphics::ptIn(const CPoint& pt) const {return (pt.m_nPosX >= m_ptLT.m_nPosX && pt.m_nPosX <= m_ptBR.m_nPosX) &&(pt.m_nPosY >= m_ptLT.m_nPosY && pt.m_nPosY <= m_ptBR.m_nPosY);
}
bool Comgraphics::InRect(const CRect& rc) const const {return rc.ptIn(m_ptLT) && rc.ptIn(m_ptBR);
}
void Comgraphics::Draw() const {// 存储n个顶点的x,y坐标int pts[10] = { m_ptLT.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptLT.m_nPosY };// 绘制n个顶点的多边形,第一个参数必须要传入n+1,pts最后一个顶点坐标和第一个相同//drawpoly(5, pts);setfillcolor(GREEN);fillpoly(5, pts);line(m_pt1.m_nPosX, m_pt1.m_nPosY, m_pt2.m_nPosX, m_pt2.m_nPosY);line(m_ptLT.m_nPosX, m_ptLT.m_nPosY, m_pt2.m_nPosX, m_pt2.m_nPosY);line(m_pt1.m_nPosX, m_pt1.m_nPosY, m_ptLT.m_nPosX, m_ptLT.m_nPosY);
}
void Comgraphics::DrawColor() {// 存储n个顶点的x,y坐标int pts[10] = { m_ptLT.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptLT.m_nPosY,m_ptBR.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptBR.m_nPosY,m_ptLT.m_nPosX,m_ptLT.m_nPosY };// 绘制n个顶点的多边形,第一个参数必须要传入n+1,pts最后一个顶点坐标和第一个相同setfillcolor(YELLOW);fillpoly(5, pts);line(m_pt1.m_nPosX, m_pt1.m_nPosY, m_pt2.m_nPosX, m_pt2.m_nPosY);line(m_ptLT.m_nPosX, m_ptLT.m_nPosY, m_pt2.m_nPosX, m_pt2.m_nPosY);line(m_pt1.m_nPosX, m_pt1.m_nPosY, m_ptLT.m_nPosX, m_ptLT.m_nPosY);
}
Draw* Comgraphics::Clone() const {return new Comgraphics(*(this));
}Draw& Comgraphics::Move(int nOffsetX, int nOffsetY) {m_ptLT.Move(nOffsetX, nOffsetY);m_ptBR.Move(nOffsetX, nOffsetY);m_pt1.Move(nOffsetX, nOffsetY);m_pt2.Move(nOffsetX, nOffsetY);return *this;
}
运行结果:
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- C++学习Day07
Day07 条件语句 条件语句的意义 条件语句、if语句或者分支结构意味着什么? 基础来说就是某些时候,当代码需要去评估某个值来决定我们下一步操作。例如:我们假设有个变量x并且赋值为5,我们能够写出当值为5的情况下而做出某些特定…...
2024/5/5 3:12:22 - 如何修改织梦DedeCms验证码的样式
修改文件验证码文件位置contude \ validateimg.php 找到 for($i0;$i<4;$i ){$rndstring . chr(mt_rand(65,90));} 改成 for($i0;$i<4;$i ){$rndstring . chr(mt_rand(48,57));} 此功能是一个随机字符,请参阅内部的号码,它是生成字符键盘代码的范…...
2024/4/15 8:40:13 - 原来还能这样使用图标……
图标的使用一、阿里巴巴矢量图标库二、搜索1.首先,搜索你想要的图标,如下图:三、下载2.找到你想要的图标,鼠标浮动到图标上,会出现如下图所示:3.点击最下面的下载图标:4.点击下载之后࿰…...
2024/5/4 19:09:57 - 数据结构-c++版-硬钢队列
数据结构-c版-硬钢队列...
2024/4/20 15:00:27 - ECharts学习笔记——第一节
ECharts入门1. 数据可视化1. 概念2. 好处3. 实现方式1. 报表类2. 商业智能BI3. 编码类2. ECharts1. ECharts的介绍2. ECharts的快速入门1. 数据可视化 1. 概念 把数据以更直观的形式展现 ----> 图表 2. 好处 清晰有效的传达数据信息更方便观察数据之间的关系,…...
2024/4/15 8:40:18 - 总结系列文章3 查询 MapReduce 任务
(1)启动集群 (2)查看在线节点数 调用Hadoop的示例jar包 提交任务 终断任务 (1)提交任务 (2)中断任务...
2024/4/19 4:50:50 - zjs-my-diary-20211102
早晨起床时间:7:20 晚上休息时间:22:11 今日总结:今天基本上又没做什么事,简单的进行了一些测试。...
2024/5/5 1:51:54 - CINTA 作业六
1.设 G 是 群,H 是 G 的子群。任取 g1,g2 属于 G, 则 g1H g2H 当且仅当 g-1g2 属于 H。 证明: 充分性 由于 g1Hg2H,g_1H g_2H,g1Hg2H, 即 ∃h1,h2∈H,\exist h_1,h_2 \in H,∃h1,h2∈H, 使 g1h1g2h2,g_1h_1 g_2h_2,…...
2024/4/15 8:40:13 - 栈和队列的OJ题
1、用栈实现队列 核心思想,栈后入先出,队列是先进先出 可以使用两个栈,一个栈是放数据的,另一个栈是出数据的。 如果出数据的栈是空的,我们就将有数据的栈全部取到出数据的栈,然后在重新放数据。 typed…...
2024/4/10 17:26:24 - [python]猜数字游戏
1.生成随机数 2.判断 代码如下 运行结果...
2024/4/6 23:40:38 - C语言杨辉三角:输入行数(1 ~ 20)VS2019
#include <stdio.h> #include<stdlib.h> int main() {int i, j, n, k, t;long Buf[21] { 0,1 }; //用于保存一行数据printf("请输入杨辉三角形的行数(1 ~ 20):\n");scanf_s("%d", &n);for (i 1; i …...
2024/5/4 23:10:36 - C语言---指针
定义指针变量: char *pa; //定义一个指向字符型的指针变量 int *pb; //定义一个指向整型的指针变量 " & " 取地址运算符 " * " 取值运算符 #include <stdio.h>int main() {char a F; //初始…...
2024/5/4 17:00:46 - java.lang.UnsupportedOperationException: null
今天遇见了以下错误: 2021-11-02 22:06:02.810 ERROR 4316 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested…...
2024/5/4 18:15:52 - jsp在页面中乱码
解决方法 : page指令是针对当前页面的指令,标签内的设定对当前页面的内容有效 pageEncoding"utf-8"决定了在浏览器显示时的title是否乱码 charset"utf-8"决定了在浏览器的内容是否乱码,utf-8改为GBK也可以保证内容不乱…...
2024/5/4 16:28:14 - JAVA程序运行机制
编译型 直接翻译程序 compile 操作系统,c/c 解释型 看不懂的解释 网页 Java具有编译型特点和解释型特点 源程序(.Java文件)→Java编译器→字节码(.class文件) 字节码(*.class文件)→类装载器→字节码校验器→解释器→操作系统平台...
2024/5/4 18:06:16 - 剑指offer 有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来(leetcode有空就刷系列之找出数组中重复的数字)
数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1&#x…...
2024/4/16 15:53:51 - JetBrains全家桶(IDEA pycharm webstorm PHPstorm等)学生认证详细图文教程
JetBrains系列软件的功能非常强大,也是我们大部分开发者的首选,但不太幸运的一点是它们都是收费软件,免费使用的一种方式就是进行学生认证,以下为学生认证的步骤: 首先我们进入JetBrains的学生认证页面,可以看到页面是…...
2024/4/25 12:44:29 - CSS颜色属性、文本文字属性、属性继承
html零基础必看——html入门,编程就是如此简单 第六章:颜色属性、文本文字属性一、颜色样式(颜色取值法)1.颜色属性值取值方法二、字体样式1. color 文字颜色2.font-size 字体大小3.font-style 文字倾斜样式4.font-weight 字体粗细…...
2024/4/15 8:41:08 - Verilog HDLBits 第二期:2.1Verilog Language-Basics
目录 前言 2.1.1Simple Wire(Wire) Solution: 2.1.2Four wires(wire4) Solution: 2.1.3Inverter(Notgate) Solution: 2.1.4AND gate(Andgate) Solution: 2.1.5NOR gate(Norgate) Solution: 2.1.6XNOR gate…...
2024/4/26 20:25:45 - Codeforces Round #752 (Div. 2) D. Moderate Modular Mode(数学)
D. Moderate Modular Mode 题目大意: 给定两个数,x,yx,yx,y,求出一个数nnn使得nmodxymodnn mod x y mod nnmodxymodn. 思路: 显然我们对于xxx,yyy的大小可以进行一个初步的限定。 …...
2024/4/15 8:41:03
最新文章
- AGI要闻:斯坦福李飞飞首次创业,瞄准“空间智能”;OpenAI下周发布搜索产品挑战谷歌;新的开源 AI 眼镜来了|钛媒体AGI | 最新快讯
多方消息证实,OpenAI将会在北京时间5月10日(周五)凌晨2点公布搜索引擎新产品消息。 斯坦福大学首位红杉讲席教授 李飞飞 通用人工智能(AGI)领域又公布了一系列重磅消息。 5月4日凌晨,据路透社,…...
2024/5/5 3:28:03 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 【Locust分布式压力测试】
Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...
2024/5/4 16:36:43 - JRT高效率开发
得益于前期的基础投入,借助代码生成的加持,本来计划用一周实现质控物维护界面,实际用来四小时左右完成质控物维护主体,效率大大超过预期。 JRT从设计之初就是为了证明Spring打包模式不适合软件服务模式,觉得Spring打包…...
2024/5/4 16:36:42 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/4 23:55:17 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/4 18:20:48 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/4 2:59:34 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57