首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么会编译报错呢?该如何处理

2012-03-25 
为什么会编译报错呢?下面的代码中B(& k)这个构造函数为甚么只能按引用方式来传递对象参数,而用按值的方式

为什么会编译报错呢?
下面的代码中
B(& k)这个构造函数为甚么只能按引用方式来传递对象参数,而用按值的方式却编译报错??

[code=C/C++][/code]
#include<iostream>
using namespace std;
class A
{
public:
A()
{
 
}
A(int aa)
{
a=aa;
}
private:
int a;
};

class B
{
public:
B()
{
a=0;
b=0;
c=0;
}
B(int aa,int bb) : a(aa),b(bb),c(aa-bb)  
{  
 
}

 
B(B &k)  
{  
a=k.a;
b=k.b;
c=k.a-k.b;
}


 
void printf()
{
cout<<a<<""<<b<<""<<c<<""<<endl;
}
private:
int a;
int b;
int c;
A d;
};


int main()
{
B a,b(1,2);
B x=a,y(b),z(2,1);  
a.printf();  
b.printf();  
x.printf();  
y.printf();
z.printf();
return 0;
}

[解决办法]
你那个定义的是copy construct函数,按值的话传参数也要调用自己,那就是无限递归
[解决办法]
#include<iostream>
using namespace std;
class A
{
 public:
 A()
 { 
}
 A(int aa)
 {
 a=aa;
 }
 private:
 int a;
};
class B
{
 public:
 B()
 {
 a=0;
 b=0;
 c=0;
 }
 B(int aa,int bb) : a(aa),b(bb),c(aa-bb)
{
  
}
  
B(B &k)
{
a=k.a;
 b=k.b;
 c=k.a-k.b;
 }
 void printf()
 {
 cout<<a<<" "<<b<<" "<<c<<" "<<endl;
 }
 private:
 int a;
 int b;
 int c;
 A d;
};
int main()
{
 B a,b(1,2);
 B x=a,y(b),z(2,1);
a.printf();
b.printf();
x.printf();
y.printf();
 z.printf();
 return 0;
}这个代码没问题啊,是你的编译器有问题吧我vs2008成功通过



[解决办法]
因为B的定义内部不能定义B类型的变量,因为编译器这时候找不到B的完整定义,但B类型的引用或者指针就可以
[解决办法]
按值传递的话,需要知道B类型的大小。B类型的定义不确定,就无法判断B类型的大小,而传递指针和引用就不需要知道B类型的大小。
[解决办法]
因为此时类型B还是个不完整的类型,如果定义对象而不是引用的话,需要知道B类型的大小,现在B是个不完整的类型,无法知道其大小,就只能使用引用或指针,而指针或引用不需要知道其大小

热点排行