no copy constructor available引发了一系列疑问

forBetter3 2010-05-28 10:04:51
我写了一个MFC程序,在一个类里声明了CPen指针m_pPen,然后想通过默认的拷贝构造函数实例化这个"笔",我的构造函数传的是一个CPen对象pen,然后我想这样做:m_pPen = new CPen(pen);这时候编译器给出一个错误,说no copy constructor available,寻思好久,就是不明白。
记得老师以前说过,假如用户没有给类写拷贝构造函数,那么编译器会为它做一个,我看了CPen的代码,它确实没重写拷贝函数啊,可是为什么会出这个问题??郁闷了好久,希望得到大家的指导,谢谢。。
...全文
424 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
AirSpuer 2010-08-11
  • 打赏
  • 举报
回复
#include "stdafx.h"
class StockA
{

protected:
StockA(){};
private:
StockA(StockA &Obj){};
void operator= (StockA &Obj){};
};
class StockB : StockA
{
public:
StockB(){};
};
int main(int argc, char* argv[])
{
printf("Hello World!\n");
StockB a;
StockB b = a; //error C2440: No copy constructor available for class 'StockB'
b = a; //error C2582: 'StockB' : 'operator =' function is unavailable
return 0;
}
AirSpuer 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lnuyasha_hrb 的回复:]
在C++中,下面三种对象需要调用拷贝构造函数:   
1) 一个对象以值传递的方式传入函数体;   
2) 一个对象以值传递的方式从函数返回;   
3) 一个对象需要通过另外一个对象进行初始化;
你的代码是第三种情况。
本来拷贝构造函数总是存在的,即使没有显式定义,编译器也会自动生成一个。但只要用户显示定义了任何一种构造函数,编译器就不会自动生成拷贝构造函数。因此还需要定义拷贝构造函数……
[/Quote]
为你的回答感到可耻!
lylm 2010-05-28
  • 打赏
  • 举报
回复
这么说太抽象,贴代码吧
lnuyasha_hrb 2010-05-28
  • 打赏
  • 举报
回复
更多的复制控制信息,请参照C++primer 复制控制一节
希望对你有所帮助!!
lnuyasha_hrb 2010-05-28
  • 打赏
  • 举报
回复
在C++中,下面三种对象需要调用拷贝构造函数:   
1) 一个对象以值传递的方式传入函数体;   
2) 一个对象以值传递的方式从函数返回;   
3) 一个对象需要通过另外一个对象进行初始化;
你的代码是第三种情况。
本来拷贝构造函数总是存在的,即使没有显式定义,编译器也会自动生成一个。但只要用户显示定义了任何一种构造函数,编译器就不会自动生成拷贝构造函数。因此还需要定义拷贝构造函数。

缺少的拷贝构造函数:

CPen(const CPen&); //拷贝构造函数

qq120848369 2010-05-28
  • 打赏
  • 举报
回复
事出有因,跟着提示找问题.
forBetter3 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 everlast2 的回复:]
希望大家在发言的时候真的可以自己先试试,毕竟对于初学者来说(包括我自己啦),大家的每一句话,都将引起他们的高度重视的。
[/Quote]
很感动啊,说出我们的心声。。。
EverLast2 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lnuyasha_hrb 的回复:]
引用 4 楼 forbetter3 的回复:

引用 1 楼 lnuyasha_hrb 的回复:

但只要用户显示定义了任何一种构造函数,编译器就不会自动生成拷贝构造函数。因此还需要定义拷贝构造函数。

缺少的……

不是吧,我记得是是这么说的(当然我自己也试过,详见下面代码):构造函数只对默认构造函数起作用,拷贝构造函数只对默认拷贝构造函数起作用而已。
而且我试过的:
C/C……
[/Quote]
这个。。。对于“会编程的猪”,我只能囧了,这不是鬼扯吗?
事实是这样的,假如你查看msdn的话,会知道,导致这个错误的有两类原因:
1.重写了
2.它的复制构造函数是private的,这种是为了防止非法使用而设置的。
而你犯的是第二种错误,可能你查看CPen的代码,会发现没有这回事,可其实有一个地方大家都忽略了,那就是父类,就像构造函数一样,父类的构造函数会影响到子类的构造,而假如你查看CObject,会发现,CObject的复制构造函数是private的,不允许外部调用。
所以会产生no copy constructor available的错误。
对于“会编程的猪”,我还是重申一次,我深情的囧了,希望大家在发言的时候真的可以自己先试试,毕竟对于初学者来说(包括我自己啦),大家的每一句话,都将引起他们的高度重视的。
forBetter3 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lnuyasha_hrb 的回复:]
引用 4 楼 forbetter3 的回复:

引用 1 楼 lnuyasha_hrb 的回复:

但只要用户显示定义了任何一种构造函数,编译器就不会自动生成拷贝构造函数。因此还需要定义拷贝构造函数。

缺少的……

不是吧,我记得是是这么说的(当然我自己也试过,详见下面代码):构造函数只对默认构造函数起作用,拷贝构造函数只对默认拷贝构造函数起作用而已。
而且我试过的:
C/C……
[/Quote]
我试了,包含指针之后也没问题啊。。。
lnuyasha_hrb 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 forbetter3 的回复:]

引用 1 楼 lnuyasha_hrb 的回复:

但只要用户显示定义了任何一种构造函数,编译器就不会自动生成拷贝构造函数。因此还需要定义拷贝构造函数。

缺少的……

不是吧,我记得是是这么说的(当然我自己也试过,详见下面代码):构造函数只对默认构造函数起作用,拷贝构造函数只对默认拷贝构造函数起作用而已。
而且我试过的:
C/C++ code

Class A
{
A(……
[/Quote]

如果你定义的类中包含指针,你再试试会不会正确,
简单的内置类型当然可以,但是假设包含指针,那样就会报错了
cattycat 2010-05-28
  • 打赏
  • 举报
回复
CPen是MFC的类,你自己直接new CPen就可以了。编译器提示的是这个类没有提供拷贝构造函数。有时候编译器会给你写个,但MFC太复杂,编译器不会提供。不要想当然认为编译器任何时候会给你提供一个。
forBetter3 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lnuyasha_hrb 的回复:]

但只要用户显示定义了任何一种构造函数,编译器就不会自动生成拷贝构造函数。因此还需要定义拷贝构造函数。

缺少的……
[/Quote]
不是吧,我记得是是这么说的(当然我自己也试过,详见下面代码):构造函数只对默认构造函数起作用,拷贝构造函数只对默认拷贝构造函数起作用而已。
而且我试过的:

Class A
{
A(int a){ m_a = a;}
int a;
}

int main()
{
A o1(2);
A o2(o1);
return 0;
}

这样并不会出问题。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧