友元 异常
一、友元
在前文中,我们将一些友元函数用于类的扩展接口,而类并非只能拥有友元函数,同时,也可以将类作为友元。在这种情况下,友元类的所有方法都能访问原始类的私有成员和保护成员。也可将特定的成员函数指定为另一个类的友元。
1、友元类
友元类的声明应该类似如下:
friend class Remote; //必须在原有类中声明
//example:class TV
{
public:friend class Remote;
}
2、友元成员函数
若仅仅需要让某一个成员函数成为另一个类的友元函数,那么需要做到以下步骤:
1、先向前声明(forward declaration)原始类。
2、声明友元类,此时只能包含成员函数的声明。
3、声明基类。
4、定义友元类,(并通过使用incline,使其成为为内联方法)
例:
class TV;
class Remote
{…………
public:void set_chan(Tv & t, int c);
}class TV
{
public:friend void Remote::set_chan(Tv & t, int c);
}incline void Remote::set_chan(Tv & t, int c){t.channel = c;}
解释原因:
1、为什么需要想前声明TV类?
答:因为在Remote类中包含了Tv类的对象的引用。
2、为什么不先声明Remote类?
答:因为TV类中也包含了友元类friend class Remote 的声明。
3、那能否先提前声明Remote,在声明TV类,再声明Remote类?
答:不能,因为在编译器看到Remote的一个方法被声明为TV类的友元前,应该先看到Remote类以及set_chan的声明。(不然你为什么说set_chan()是TV的友元成员函数呢?)
4、为什么不直接在Remote类的声明中定义类方法?
答:因为类方法中包含了对TV类方法的访问,而此时编译器仍不知道TV类有什么方法。
注:
1、Tv类决定谁是它的友元。
2、友元类的声明并不需要向前定义。
3、其他友元关系
若需要一些A类方法影响B类对象的同时,B类方法也能影响A类对象,则可以让A、B类互相成为对方的友元。
但需要注意的是: 对于使用A类对象的B类方法, 其必须在声明A类后定义.
class TV
{friend class Remote;
public:void buzz(Remote & r);
};class Remote
{friend class TV;
public:void Bool volup(TV & t){t.volup();}
};inline void TV::buzz(Remote & r)
{...}
4、共同的友元。
需要使用友元的另一种情况,函数需要访问两个类的私有数据。在这种情况下,可以把它设置为两个类的友元:只需要在两个类中同时包含友元函数的声明即可,同时,也应该注意也要前向声明。
例:
class Analyzer;
class Probe;
{friend void sync(Analyzer & a, const Probe & p);friend void sync(Probe & p, const Analyzer & a);
};class Analyzer
{friend void sync(Analyzer & a, const Probe & p);friend void sync(Probe & p, const Analyzer & a);
};incline friend void sync(Analyzer & a, const Probe & p)
{}
incline friend void sync(Probe & p, const Analyzer & a)
{}
二、嵌套类。
在C++中,可以将类声明放在另一个类中。在另一个类声明的类被称为嵌套类(nested class):通常用于提供新的类型类作用域来避免名称混乱。包含类的成员函数可以创建和使用被嵌套类的对象;当且仅当声明位于共有部分,才能在包含类的外面使用嵌套类,同时必须使用作用域解析运算符。
对类进行嵌套与包含不同,包含意味着将类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型,该类型仅在包含嵌套类声明的类中有效。
class Queue
{
private:struct Node{Item item;struct Node *next;};
};
由于结构是一种其成员在默认成员下为公有的类,所以Node是一个嵌套类。但是,该定义并没有充分利用类的功能——它没有构造函数。具体的说,它没有显示构造函数。
因此,修改为:
class Queue
{class Node{public:Item item;Node *next;Node(const Item & i): item(i),next(0){}};
};
1、嵌套类和访问权限
有两种访问权限适合嵌套类。嵌套类的声明位置决定了嵌套类的作用域,即程序的哪些部分可以创建这种类的对象。
1、作用域。
1、若嵌套类在另一个类的私有成员中声明,只有后者知道它。
2、若嵌套类是在另一个类的保护部分中声明,则它对于后者以及其派生类可见,同时对外界不可见。
3、若嵌套类是在另一个类的共有部分中声明,则允许后者、后者的派生类以及外部世界使用,其中,外界使用时要同时使用类限定符。
2、访问控制。
类可见后,起作用的将是访问控制。对嵌套类访问权的控制规则与对常规类相同。即:Queue类对象只能访问Node对象的公有成员,同时,若将Node限定为Queue的私有成员,则Node对外界不可见。
2、模板中的嵌套
将某个类转换为模板时,不会由于它包含嵌套类而带来问题。
#ifndef QUEUETP_H_
#define QUEUETP_H_template<class Item>
class QueueTP
{
private:enum {Q.SIZE = 10};class Node{public:Item item;Node *next;Node(const Item & i):item(i), next(0){}};Node * front;Node * rear;int items;const int qsize;QueueTP(const QueueTP & q):qsize(0){}QueueTP & operator=(const QueueTP & q){return *this;}
public:QueueTP(int qs = Q_SIZE);~Queue();bool isempty()const{return item == 0;}bool isfull()const{return item == qsize;}int queuecount()const{return items;}bool enqueue(const Item & item);bool dequeue(Item & item);
QueueTp<double>dp;
QueueTp<char>cq;
以上的两个声明的创建不会导致Node类型冲突:一个的类型为QueueTp<double>::Node,而另一个的类型为QueueTp<char>::Node。
三、异常。
程序在运行阶段遇到错误时,会导致程序无法正确运行。而C++提供了一种新的工具。
1、abort() 的调用
观察算式: 2.0 * x * y/(x + y),若x = -y,将会导致异常。
而一个解决方法就是调用abort函数:它的函数原型位于cstdlib或者stdlib.h头文件中,其典型实现为向标准错误流(即cerr使用的错误流)发送消息abnormal program termination,随后终止程序。它还返回一个随实现而异常的值:或操作系统或父进程。abort是否刷新文件缓冲区则取决于实现,而exit()函数将会刷新,同时不显示消息。
注:上述文件缓冲区:用于存储读写到文件中的数据的内存区域。
使用:
int main()
{double x, y, z;std::cout<<"Enter two numbers: ";while (std::cin>>x>>y){z = hmean(x,y);std::cout<<"Harmonic mean of "<<x<<"and " <<y<<" is " <<z<<std::endl;}std::cout<<"Bye!\n";return 0;
}double hmean(double a, double b)
{if( a == -b){std::abort();}return 2.0 * x * y/(x - y);
}
2、返回错误码。
一种比异常终止更灵活的是使用函数的返回值指出问题。
如ostream类中的get(void)成员返回下一个输入字符的ASCII码,但到达文件尾时,返回EOF(end of file),对hmean()来说,这种方法不管用:任何数值都是有效的返回值——在这种情况下,可使用指针参数或引用参数来将值返回给调用程序,并使用函数的返回值指出成功或失败。而非直接引发异常。
#include<iostream>
#include<cfloat>bool hmean(double a, double b, double * ans);int main()
{using namespace std;double x, y, z;while(cin>>x>>y){if(humean(x, y, &z))……;}
}bool hmean(double a, double b, double * ans)
{if(a == -b){*ans = DBL_MAX;return false;}else{*ans = 2.0*a*b/(a+b);return true;}
}
可以看到,在修改过的hmean函数中,我们在函数定义中传递指针,在函数使用中创建引用,因此会产生这样的结果:函数中的指针参数指向了对z的引用——即z本身,因此可以在通过返回值确定异常与否的同时修改z的值。
3、异常机制
C++异常是对程序运行过程中发生情况的异常情况的一种响应。异常提供了将控制权从一个程序的一部分传递到另一个部分的途径。对异常的处理有三个部分:
1、引发异常。
2、使用处理程序捕获异常。
3、使用try块。
在这个部分,我们介绍三个关键字:throw、try和catch。
其中,throw表示引发异常,紧随后的值(字符串或对象等)指出异常的特征——这个过程由程序员完成。而throw的执行则类似于返回语句:它终止函数的执行,然而与之不同的是,它将控制权交给沿程序调用栈后退,直到包含try块的函数,而非交给调用程序。
在介绍try和catch前,我们先介绍异常处理程序(exception handler):用来捕获异常,位于要处理问题的程序中。
而catch关键字,则表示捕获异常。其随后的类型声明,指出异常处理程序要响应的程序类型,之后再使用一个代码块指出要采取的措施。
try块标识其中特定的异常可能会被激活的代码块,其后跟随一个或多个catch块。
以下为一个实例:
#include<iostream>
double hmean(double a, double b);int main(void)
{double x, y, z;std::cout<<"Enter two numbers: ";while(std::cin>>x>>y){try{z = hmean(x, y); //可能会引发异常的代码块}catch(const char* s){std::cout<<s<<std::endl;std::cout<<"Enter a new pair of numbers: ";continue;}std::cout<<"Harmonic mean of "<<x<<" and "<<y<< " is "<<z<<endl;std::cout<<"Enter next set of numbers<q to quit>: ";}std::cout<<"Bye!\n";return 0;
}double hmean(double a, double b)
{if( a == -b)throw "bad hmean() arguments: a = -b is not allowed"; //若出现异常,程序终止,并退回 //到上一个try块,寻找与之匹配的catch, 由于我们给定const char* 的类型,因此仅与//仅有的一个catch匹配,则调用该代码块中的内容return 2.0 * a * b/(a+b);
4、将对象用作异常类型
通常,我们选择将对象而非字符串通过throw传递:这样做可以使用不同的异常类型区分不同函数在不同情况下引发的异常,同时catch块能根据相应的对象决定采取什么措施。
在采用对象后,上述的一部分修改为:
class bad_hmean
{
private:double v1;double v2;
public:bad_hmean(double a = 0, double b = 0) :v1(a), v2(b) {}void mesg();
};inline void bad_hmean::mesg()
{using namespace std;cout << "hmean(" << v1 << ", " << v2 << "): "<< "invalid arguments: a = -b\n";
}//对象声明catch (bad_hmean& bg){bg.mesg();continue;} //catch块中if (a == -b)throw bad_hmean(a, b); //hmean中
5、异常规范和C++11
异常规范(exception specification)是一个在 C++98中新增,同时在C++11中不太需要(原文: 摈弃)的功能。
使用如下:
double harm(double a) throw(bad_thing);
其中throw()部分就是异常规范,出现在函数原型和函数定义中,可包含有可不包含类型列表。
作用:
1、告诉用户可能需要使用的try块。
2、让编译器添加运行阶段检查的代码,检查是否违反了异常规范。
然而问题在于第二个:实际上很难检查,因为使用marm()可能不会异常,而它调用一个函数,同时它调用的这个函数也调用了另外一个函数,而这个函数存在异常,因此:在编写库时,它不会出现异常,而库更新后,却会出现异常。
因此C++11告诫我们,最好不要使用该功能。然而,C++也支持一种特殊的异常规范:
double marm() noexcept;
它指出函数不会引发异常——用于解决上述存在的问题,因此,使用该关键字就表用程序员对它编写的这段代码做出了承诺。
6、栈解退
假定try块并未调用可能引发异常的函数,而是调用了对引发异常的函数进行调用的函数,则程序会从引发异常的函数跳到包含try块的函数。
C++对于函数调用的处理: 程序将调用函数的指令的地址,并放在栈中,当被调用的函数执行完毕后,程序将使用该地址来确定从哪里开始执行。同时,函数调用也会将函数参数、以及新创建的自动变量(包括对象)放在栈中。若同时还调用了另外一个函数,则也将该函数放在栈中,同时,在每个函数调用结束后,都会释放其自动变量,若包含对象,则会调用相应的析构函数。
而在函数出现异常的情况下,程序也会释放内存,不仅会仅仅回到第一个返回地址,而是沿路线依次释放函数所调用的内存空间,直到找到第一个位于try块的返回地址。同时,控制权将转到块尾的异常处理程序,而非try块的第一个语句。这个过程称为栈解退。
综上,引发机制的一个十分重要的特性在于:函数的返回仅处理该函数放在栈中的对象,而throw则处理从throw到try块中所有函数序列放在栈中的对象。
注意:在catch函数块中,使用break和exit(EXIT_FAILURE)将会导致不同的运行:
1、使用break: 将退出该循环,而程序将继续进行。
2、使用exit(EXIT_FAILURE):程序将直接退出,而不会进行后续的操作(即便循环结束后还有代码)。
7、其他异常特性
综上所述,虽然throw-catch机制类似于函数参数和函数返回机制,不过实际上仍然存在不同:
其中之一是:函数fun()中的返回语句将控制权转交给调用fun的函数,而throw语句将控制权向上返回到第一个能捕捉相应异常的try-catch组合。
另一个不同之处在于:引发异常时,编译器总是创建一个临时拷贝,即使 异常规范 和 catch块中指定的引用。如:
class problem{};void super()
{if(xxx){problemm oops;throw oops;}
}try // in main function
{super();
}catch(problem & p)
{
//xxx
}
在学习函数的过程中,super()中创建的变量会在调用完函数后消失,因此在引发异常时,编译器总时创建一个临时副本,使得从try调用->super()->catch函数中的过程中,这一变量依然存在。
那么,既然仍然会创建一个临时变量,为何选择还是用引用呢——引入引用的目的就是为了避免创建临时变量、或者能够直接修改数据内容。答案是:基类引用可以指向派生类对象。因此,假设有一组通过继承关联起来的异常类型,那么在异常规范中只用列出一个基类引用即可。然而,这又会引出下一个问题:
catch中的类似于参数列表的项目需要不同的参数名,因此不能全部用基类引用匹配,为此,解决方法为:按照与派生相反的顺序排序catch中的项目名。
同时,将引发异常和创建对象组合到一起会更为简单。
throw problem(); //()为参数列表
同时,类似于switch中的default,在try-catch代码块中,可以将能够捕获所有异常的catch块放在最后面(例如:若捕获的异常为对象,那么便可将基类引用放在最后)
8、exception类
C++异常的主要目的是为设计容错程序提供语言级支持,即异常使得在程序设计方面包含错误处理功能更容易,以免事后采取一些严格的错误处理方式。
较新的编译器将异常合并到语言中。exception头文件中定义了exception类,C++可将其用作其他异常类的基类。代码可以引发exception异常,也可以将exception用作基类。在类方法中,what()虚方法返回一个特征随实现而异的字符串。因此可以在从exception派生而来的类中重新定义它。
#include<exception>class bad_hmean : public std::exception
{
public:const char * what(){return "bad arguments to hmean()"}
};
同时,在C++库中,也定义了许多基于exception的异常类型。
1、stdexcept异常类
该文件定义了logic_error和rumtime_error类——以公有方式从exception派生而来。这两个类被用作派生类系列的基类。
class logic_error: public exception {public:
explicit logic_error(const string& what_arg);
};
从logic_error中,还派生出了:domain_error、invalid_error、length_error、out_of_bounds等一些列类,每个类中均有一个类似于logic_error的构造函数,能提供一个供what()方法返回的字符串。
domain_error(定义域异常):表明提供参数大小超出了函数所接受的范围,arcsin函数接受的参数范围为-1到1,而提供参数则不在这个范围内,那么将会导致domain_error。
invalid_error(不合法异常):即给函数传递了一个意料之外的值:若程序需要的是仅包含0或1的字符串,而传上来的字符串不止包含这两个数字,那么则会导致invalid_error。
out_of_bound(越界(异常)):通常用于指示索引错误。在定义一个类似于数组的类时,其operator()[]在使用索引无效时将会引发out_of_bound异常。
length_error(长度异常):指出将没有足够的空间执行所需的操作,例,合并string类的append()方法在合并得到的字符串超过最大限度后,将会导致length_error。
在runtime_error的派生类中,描述了可能在运行期间发生但难以预计或防范的错误。由以下错误类型:
range_error、overflow_error以及underflow_error。
underflow_error(下溢错误):发生在浮点数计算中,一般而言,存在浮点类型可以表示的最小非零值,若计算结果比这还小将会产生下溢错误。overflow_error(上溢错误)发生在整数和浮点数中,当计算结果超过某一个值时,将会发生上溢错误。而计算结果不在函数允许的范围类时,可以使用range_error异常。
2、bad_alloc异常和new
对于由new导致的内存分配问题,C++的处理方法为让new引发bad_alloc异常,头文件new中包含了bad_alloc类的声明——它也是由exception派生而来。
#include<iostream>
#include<new>
#include<cstdlib>
using namespace std;struct Big
{double stuff[20000];
};int main()
{Big * pbtry{cout<<"Trying to get a big block of memory:\n";pb = new Big[10000]; //可能会抛出异常的地方cout<<"Got past the new request:\n";}catch(bad_alloc & ba){cout<<"Caught the exception!\n";cout<<ba.what()<<endl;exit(EXIT_FAILURE);}cout<<"Memory successfully allocated\n";pb[0].stuff[0] = 4;cout<<pb[0].stuff[0]<<endl;delete[]pb;return 0;
}
可以看到,在上面的函数中并没有使用throw来抛出异常,原因在于我们调用了C++的标准库new,其中的bad_alloc当new出现内存不够的情况下,会抛出异常。
3、空指针和new
学过C语言的知道,malloc()在内存不够的情况下会返回空指针,而C++也出现了一种在失败时返回空指针的new,用法如下:
int *pi = new(std::nothrow)int;
int *pa = new(std::nowthrow)int[500];
9、异常 类和继承
异常、类和继承以三种方法相互关联。
1、可以从一个类派生出另外一个。
2、可以在类定义中嵌套异常类声明组合异常。
3、这种嵌套声明本身可被继承,还可用作基类。
10、异常的迷失方向
1、当引发了异常,却找不到相应的异常匹配时,会导致意外异常(unexpected exception)——它会导致程序异常终止。
2、若异常并不在函数中引发,那么必须捕获它。若未被捕获,则会导致未捕获异常(uncaught exception)。
对于未捕获异常:程序不会立刻终止,而是先调用terminate()函数,它会调用abort()函数。同时,也可以调用set_terminate()函数来修改terminate()函数,使其调用特定的函数,例:
typedef void (*terminate_hander)();
terminate_hander set_terminate(terminate_handler)throw(); //C++98
terminate_hander set_terminate(terminate_handler)noexcept: //C++11void terminate(); //C++98
void terminate()noexcept;//C++11
11、有关异常的注意事项:异常和动态内存分配
若有以下代码:
void test(int n)
{double * ar = new double[n];if (xxx)throw exception();delete[]ar;return;
}
在以上代码中,若出现异常,exception将会使程序终止,然而此时并没有调用ar的delete,因此会导致内存泄漏。解决如下:
void test(int n)
{double * ar = new double[n];try{if(xx)throw exception();}catch(exception & ex){delete [] ar;return;}return;
}
显然,这是个笨办法,我们将在后面介绍智能指针模板来解决这个问题。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- springboot工程导入本地jar
首先,你需要一个springboot工程在主目录({basedir})下新建文件夹(lib),放入你的jar包(aspose-cad-19.9.jar)接下来,打开pom.xml文件,添加下列代码 此处需要注意的是,你需要知道这个jar包的groupId、artifactId、version诶!可以直接复制哦!<dependency><g…...
2024/4/27 17:07:33 - C++STL
STL是什么 C++标准:ANSI是ISO组织的美国分支机构。 所以,他们是一样的。 通常是 ANSI制定标准,然后ISO修改批准,ANSI再修改,所以最后他们就一样了,一般写作ANSI/ISO C++。 翻译过来就是标准C++。 STL是C++的ANSI/ISO标准的一部分,STL提供了大量的可服用软件组织, STL…...
2024/4/17 15:55:07 - 160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注…...
2024/4/27 2:09:37 - 批量上架!!!!
批量上架 商品!!批量上架商品!!!看看流程步骤! 1、复制京东链接 2、归类好 京东链接,都是一个系列的产品 加微信了解 : maomaoOS...
2024/4/26 22:47:00 - BitMap的原理和实现
相关概念基础类型在java中:byte -> 8 bits -->1字节 char -> 16 bit -->2字节 short -> 16 bits -->2字节 int -> 32 bits -->4字节 float -> 32 bits -->4字节 long -> 64 bits -->8字节位运算符在java中,int数据底…...
2024/4/21 13:15:51 - C++ LeetCode104 二叉树的最大深度
递归比较 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:int maxDepth(TreeNode* root) {if(root==NULL…...
2024/4/27 9:50:07 - 关于映入aar包的方法
突然最近发现很多SDK的引入由原来的jar包形式更换成aar形式,比方说最新版本的友盟crash的包,支付宝最新支付包。然后我们项目采用模块化开发,就造成尝试以前的各种方法引入不进来。关键是以前也很少有lib用aar的形式.先说说我在项目导入aar包的方法,然后再说一个IT大飞说写…...
2024/4/26 7:47:56 - 6.纹理
1.纹理采样:根据纹理坐标获取像素值2.纹理环绕:当纹理坐标超出默认范围时纹理的重复方式,OpenGL提供了以下几种方式对纹理环绕方式进行设置:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, G…...
2024/4/23 19:35:59 - configure.ac:24: error: must install xorg-macros 1.15 or later before running autoconf/autogen
使用apt-get install xutils-dev 转自:configure.ac:24: error: must install xorg-macros 1.15 or later before running autoconf/autogen...
2024/3/25 15:00:39 - Eureka服务器搭建入门
1、加入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>2、application.yml配置 server:port: 10086 spring:application:name: eureka…...
2024/4/27 13:19:46 - mybatis源码学习------缓存模块
简介 在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。 MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓存模块实现的。这里…...
2024/4/27 6:54:31 - 基于关联规则与可平面图的商品摆放规划-----实验报告
基于关联规则与可平面图的商品摆放规划 摘要: 本文先对northwind数据库介绍与数据描述与简单分析(数据异常值处理,订单地址的文本挖掘),然后对购买的商品使用关联规则算法,进行关联分析与商品的购买情况分析,由关联规则的发现结果,使用图论方法分析商品的摆放图。 关键词: …...
2024/4/25 5:07:41 - Linux编译安装中configure、make和make install各自的作用详解
前言:我们经常在Linux中通过源码安装软件会经过以下三个步骤,但是每一个步骤到底是什么意思呢?本文来详细说明。总的来说,这些都是典型的使用GNU的Autoconfigure和Automake产生的程序的安装步骤。(1)./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是…...
2024/4/11 11:29:53 - XSS攻击原理及防御措施
一、XSS攻击原理 XSS是什么?它的全名是:Cross-site scripting,为了和CSS层叠样式表区分所以取名XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言…...
2024/4/27 2:59:05 - go语言学习笔记(二)
go程序函数可变参数函数匿名函数方法接口语句 函数 函数名(参数名 参数类型,参数名 参数类型) 返回值类型 { } 可以没有函数中的输入参数和返回值func 函数名() { } 如果一个函数有多个返回值,那么这些返回值必须用 ( ,) 括起来。 从函数中可以返回一个命名值。一旦命名了返…...
2024/4/1 3:54:10 - 如何搭建分销国外网店系统呢
许多人利用身旁小伙伴推荐或刷朋友圈的那时候发觉分销网店,许多店家都看中分销国外网店系统的发展前途。殊不知,如何搭建分销国外网店系统变成了许多 店家的拦路虎,今日beeecshop小编就来协助店家处理这个拦路虎的状况。 第一步:为分销国外网店取1个简易且短的域名 要创建1…...
2024/4/27 2:18:41 - 为何国外网店系统开发如此火
伴随着科技进步的持续创新,网站建设技术应用和系统功能也在不停的提高。现如今电商网站的作用变得越来越强劲,电商网店的网页也设计构思得变得越来越炫,以便提高企业的市场占有率和提高商品的名气,许多 商户也为自己的企业研发了自身的外贸电商系统。有着外贸电商国外网店系…...
2024/4/1 5:48:04 - 程序设计专题
文章目录Chapter 1 模块化程序设计代码规范结构化程序设计头文件编译预处理递归Chapter 2 多文件项目文本文件和二进制文件多文件的程序结构文件模块间的连接文件包含文件模块间的通信--存储类别工程文件Chapter 3 链表内存动态分配C程序内存分布区域动态按需分配所需函数链表单…...
2024/4/23 22:49:13 - 如何解决IIS7多域名绑定同一物理目录,设置不同的默认文档的问题?
因为在一个物理目录下只有一个web.config,并且IIS7把默认文档设置写在这里,导致所有域名的默认文档设置共享,很多人对此束手无策,甚至有人说这是IIS7的bug。其实IIS7不会比IIS6落后的,这个问题也很好解决,下面是解决方案: 1、进入%windir%\system32\inetsrv\config目录(…...
2024/4/4 6:42:02 - 7.矩阵变换
1.使用OpenGL Mathematics,下载GLM后,将文件路径加入包含路径(不需要编译和链接)2.平移、旋转、缩放矩阵glm::vec4 vec(1.0f,0.0f,0.0f,1.0f); //默认是一个单位矩阵(9.9版本之后的GLM应改为glm::mat4 trans(1.0f);) glm::mat4 trans; //缩放 trans = glm::scale(trans,g…...
2024/4/26 19:13:55
最新文章
- conda创建新环境
1、创建虚拟环境: Anaconda创建环境:比如,创建pyhon=3.6的版本环境取名叫 name conda create -n name python3.6 2、删除虚拟环境操作:(谨慎操作) conda remove -n name --all &am…...
2024/4/27 22:52:42 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 分享一个Python爬虫入门实例(有源码,学习使用)
一、爬虫基础知识 Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍: 架构和组成:下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。解析器:用于解…...
2024/4/23 7:26:06 - 手机无线投屏到windows11电脑
1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...
2024/4/26 12:46:48 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/27 1:53:53 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/27 3:39:11 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/27 12:24:35 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/27 12:24:46 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/27 3:39:08 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/27 3:39:07 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/27 3:39:07 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/27 12:44:49 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/27 21:08:20 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/26 22:35:59 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/27 18:40:35 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/27 3:39:03 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/27 13:52:15 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/27 13:38:13 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/27 1:03:20 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/27 3:22:12 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/27 22:51:49 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/27 3:39:00 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/26 23:53:24 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/27 20:28:35 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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