返回信息流求助,如题,这个问题一直困扰我很久了,求大牛帮解,谢谢
我是写的C++,我的问题的主要代码如下:
class A
{
public:
A();
virtual ~A();
}
class B
{
public:
B(A& a);
virtual ~B();
void SetA(A& a);
private:
A& iA;
}
B::B(A& a) : iA(a)
{}
void B::SetA(A& a)
{
iA = a;
}
void main()
{
A* a = new A();
B* b = new B(*a);
delete a;
a = new A();
b->SetA(*a);
delete b;
delete a;
}
可是我编译时,"iA = a;" 这行就出现这个错:
non-static reference member can't use default assignment operator
求C++大牛们解答,谢谢
这是一条镜像帖。来源:北邮人论坛 / cpp / #39577同步于 2010/5/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
non-static reference member can't use default assignment op
mimi101cat
2010/5/25镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
因为 引用 必须在定义的时候就初始化,在你的B的定义里面,光有 A& iA 而没有立即对它进行初始化,想要把初始化推迟,这是不允许的。
需要用 A*
【 在 ericyosho 的大作中提到: 】
: 因为 引用 必须在定义的时候就初始化,在你的B的定义里面,光有 A& iA 而没有立即对它进行初始化,想要把初始化推迟,这是不允许的。
: 需要用 A*
b不是有个构造函数吗,我觉得是set的问题。
【 在 a206206 的大作中提到: 】
:
: 【 在 ericyosho 的大作中提到: 】
: : 因为 引用 必须在定义的时候就初始化,在你的B的定义里面,光有 A& iA 而没有立即对它进行初始化,想要把初始化推迟,这是不允许的。
: ...................
对,是Set的问题,如果没有Set函数,程序是可以通过的
【 在 ericyosho 的大作中提到: 】
: 因为 引用 必须在定义的时候就初始化,在你的B的定义里面,光有 A& iA 而没有立即对它进行初始化,想要把初始化推迟,这是不允许的。
: 需要用 A*
: --
: ...................
也就是说,引用在初始化之后就不可以更改了,是吗,谢谢
第一次执行delete a;之后,指针b所指向对象的成员A& iA;所引用的a已经被析构了,下面再执行b->SetA(*a);时,会把*a赋值给b所指向对象的成员iA引用的对象,但这个iA引用的对象已经不存在了,所以发生错误
同意,
另外一点就是类的引用成员只能在初始化列表中初始化。
菜鸟敬上
【 在 Vampire 的大作中提到: 】
: 类定义后面加个分号
: 再把A类的构造函数、A和B类的虚析构函数都实现了
: 没发现其他报错的地方
: ...................
class A
{
public:
virtual ~A(){};
};
class B
{
public:
B(A& a);
virtual ~B(){};
//void SetA(A& a);
private:
A& iA;
};
B::B(A& a) : iA(a)
{}
/*
void B::SetA(A& a)
{
iA = a;
}
*/
int main()
{
A* a = new A();
B* b = new B(*a);
delete a;
a = new A();
//b->SetA(*a);
delete b;
delete a;
return 0;
}