热情软件屋

 

错误C2558: no copy constructor available


编号:QA001501
建立日期: 1999年8月12日 最后修改日期:1999年8月12日
所属类别:

LYONS:
    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;
     }

此问题由曾侃回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio