VC++ 5.0
WIN95
本人在用VC++ 5.0 开发一应用程序时遇到如下问题:
从CStdioFile 类派生CSearch 类:
class CSearch : public CStdioFile
其中一个成员函数SearchNode如下:
CStringArray CSearch::SearchNode(CString csDesiPin)
{
CStringArray a;
a.Add("test");
return a;
}
编译时产生如下错误:
error C2558: 'CStringArray::CStringArray' : no copy constructor available
查看错误说明和在线帮助后仍不能解决。
回答:
对于直接返回类的函数,该返回类型的类必须要有copy constructor(拷贝构造函数)。
例如 先定义了 class A;
若有一函数, 其返回值类型是 A,
A f1(){
A var1;
....
return var1;
}
则当使用该函数时,
A b;
b=f1();
其过程是,
1,当f1执行返回时,先产生一个临时变量
2,将要返回的值 var1 拷贝到 临时变量中。因为一旦 f1 执行完,var1 将被析构。
3,变量b再调用赋值操作将临时变量中的值赋给b。
4,临时变量被析构。
其中第2步需要拷贝构造函数。临时变量的构造和析构过程都由编译器自动完成。
(有关临时变量,请看 HELP,Key Word, Temporary Objects)
本来拷贝构造函数总是存在的,即使没有显式定义,编译器也会自动生成一个。但只要用户显示定义了任何
一种构造函数,编译器就不会自动生成拷贝构造函数。
(请看 HELP,Key Word, C2558)
查看 CStringArray 的 help 及由 VC5 提供的源程序,都可知已经定义了 构造函数 CStringArray(), 因此
拷贝构造函数不会被自动生成。
建议修改办法如下:
法1,
void CSearch::SearchNode(CString csDesiPin, CStringArray &a)
{
a.Add("test");
}
法2,由CStringArray派生CStringArray1,并增加拷贝构造函数。
CStringArray1 CSearch::SearchNode(CString csDesiPin)
{
CStringArray1 a;
a.Add("test");
return a;
}
文章链接:http://www.quke.org/post-78.html
注:将对象作为函数的返回值是,在return 对象后,会调用该对象的拷贝构造函数,重新创建一个临时的该类型的对象,如再将该返回值复制给某个变量,这有会调用该对象的拷贝构造函数,而此处CStringArrary只有无参的构造函数,没有拷贝构造函数,所不能将该对象作为返回值,另一方面在C++返回数组对象时是要进行复制操作,这非常的消耗时间和调用堆栈!