有关子类的拷贝构造函数

zourong0412 2010-11-23 12:10:21
本来打了一大段话的,可不知道为什么诊断链接错误,所以,直接将代码发上来了,主要问题是:
error C2091: function returns function
如果不建立拷贝构造的话,可以运行,我上网查了很多的资料,可是,都几乎是超长的代码,有人直接建议我不要用拷贝构造函数了,但是我很想知道这段代码应该怎么改?(除了将拷贝给删了之外。)
谢谢各位了。
#include<iostream>
using namespace std;

class B
{
int a,b;
public:B(){};
B(int i,int j){a=i;b=j;}
B(B &s)(){a=s.a;b=s.b;}
~B(){cout<<"Destructor"<<endl;}
void printb()
{
cout<<"a="<<a<<",b="<<b<<endl;
}
};

class A
{
B c;
public:
A();
A(int i,int j):c(i,j){};
A(const A &d):c(&d){};
void printa(){c.printb();}
};

int main()
{
A a(7,8),b(a);
a.printa();
b.printa();
return 0;
}
...全文
142 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zourong0412 2010-11-25
  • 打赏
  • 举报
回复
谢谢大家,我终于明白了,我犯了一个超级愚蠢的错误呵呵,拷贝构造函数,我已经加了()了,结果还再加了一个括号。
还有第二个问题,最重要的是常数据成员的问题,之前定义的不是const,却在后面定义了const,const不能修改数据成员的。
最后还有一个问题就是,引用的时候,语法格式不对,应该为:A( A &d):c(d.c){};//这里我漏了个d...用的是对象的数据成员,而我之前写的根本不是初始化列表。
根据大家的回答,我认为对我最有帮助的答案是mstlq的呵呵,很清晰,明了,不过大家还是会给分的哈哈!
谢谢大家了~
zourong0412 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mstlq 的回复:]
这样就行了

C/C++ code

#include<iostream>
using namespace std;

class B
{
int a, b;
public: B() {};
B(int i, int j) {a = i; b = j;}
B(const B &s) {a = s.a; b = s.b;}
~B() ……
[/Quote]

前面第一句改的我明白了,后面的,出现了:
class 'B' : no copy constructor available
zourong0412 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dubiousway 的回复:]
#include<iostream>
using namespace std;

class B
{
int a,b;
public:B(){}
B(int i,int j){a=i;b=j;}
B(B &s){a=s.a;b=s.b;}//B(B &s)(){a=s.a;b=s.b;}
~B(){cout<<"Destructor"<<endl;}
void ……
[/Quote]
谢谢~调试成功了,可是输出的结果却好奇怪啊,是地址的值。
gules 2010-11-23
  • 打赏
  • 举报
回复
这样的类,不需要自行声明与定义拷贝构造、赋值操作及析构函数,代码自然也就简单清晰了。
mstlq 2010-11-23
  • 打赏
  • 举报
回复
这样就行了

#include<iostream>
using namespace std;

class B
{
int a, b;
public: B() {};
B(int i, int j) {a = i; b = j;}
B(const B &s) {a = s.a; b = s.b;}
~B() {cout << "Destructor" << endl;}
void printb() {
cout << "a=" << a << ",b=" << b << endl;
}
};

class A
{
B c;
public:
A();
A(int i, int j): c(i, j) {};
A(const A &d): c(d.c) {};
void printa() {c.printb();}
};

int main()
{
A a(7, 8), b(a);
a.printa();
b.printa();
return 0;
}
dubiousway 2010-11-23
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

class B
{
int a,b;
public:B(){}
B(int i,int j){a=i;b=j;}
B(B &s){a=s.a;b=s.b;}//B(B &s)(){a=s.a;b=s.b;}
~B(){cout<<"Destructor"<<endl;}
void printb()
{
cout<<"a="<<a<<",b="<<b<<endl;
}
};

class A
{
B c;
public:
A();
A(int i,int j):c(i,j){};
A(const A &d){}//A(const A &d):c(&d)
void printa(){c.printb();}
};

int main()
{
A a(7,8),b(a);
a.printa();
b.printa();
return 0;
}
luciferisnotsatan 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gules 的回复:]

这样的类,不需要自行声明与定义拷贝构造、赋值操作及析构函数,代码自然也就简单清晰了。
[/Quote]
+1
你这就int,用默认的就行了,


B(B &s)(){a=s.a;b=s.b;}

64,654

社区成员

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

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