C++重载赋值运算符: “不能转换`B *``到A *`” 错误
class B;
class A{
B *b;
public:
void operator= (B *b){
this->b = b;
}
};
B *b = new B()
A *a = new A();
a = b;
我得到一个 “不能转换B*
到A*
” 的错误。 有没有办法解决这个问题?C++重载赋值运算符: “不能转换`B *``到A *`” 错误
现在,如果有一种方法,如果我使用类似:
a = NULL;
哪个运营商“=”将被使用?
你operator=
提供了一个A
从B*
分配。您的代码不提供从B*
到A*
的转换(如错误消息所示)。因此,a=NULL
将不会使用您提供的赋值运算符,因为a
是指针,而不是A
。您的代码允许从B*
转换为A
,如A a= new B();
。
如果你打算使用实际的对象,而不是指针,从你的代码中删除所有*
:
class B{};
class A{
B b;
public:
void operator= (const B& b){ //pass non-primitives by const reference
this->b = b;
}
};
B b;
A a;
a = b;
如果你想使用指针,只有“有用”的方式来分配B*
到如果B
对象来自A
,则为A*
。这似乎不是你在做什么,所以将B*
分配给A*
在你的代码中是没有意义的。
为了说明清楚,'void operator =(B * b)'将仅用于** B b; A =&b;' – NtscCobalt
您已经指定了指针而不是对象。只需更换与最后一个指令: *a = b;
要回答的第二个问题:NULL可以在编译器不止一种方式来定义(如最新的标准,无论是作为整体0
或文字nullptr
)。指针也可以转换为其他类型的指针,但是将void*
传递给一个采用int*
或long*
的重载函数可能会使编译器无法解析正在调用的函数。
但是,如果您想避免NULL,只需改为operator(B& b)
即可。参考文献肯定是指向一个对象。
在C++中,NULL被定义为0.这是唯一合法的定义。 –
我确定在MSVC2008中观察到NULL被定义为'((void *)0)'。 –
在C++中,NULL必须是空指针常量(通常是值为0的整数常量表达式)。与C'((void *)0)不同,它不能被转换,比如没有转换就转换成int *。 –
更改语句分配给到:
*a = b;
您的重载指定给'A',而不是'A *'。 – chris
您正在为指向“A”的指针分配一个指向“B”的指针,这与将“B”指派给“A”不同。 – juanchopanza
谢谢大家。菜鸟错误! – nahpr