C++重载赋值运算符: “不能转换`B *``到A *`” 错误

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; 

哪个运营商“=”将被使用?

+2

您的重载指定给'A',而不是'A *'。 – chris

+1

您正在为指向“A”的指针分配一个指向“B”的指针,这与将“B”指派给“A”不同。 – juanchopanza

+0

谢谢大家。菜鸟错误! – nahpr

operator=提供了一个AB*分配。您的代码不提供从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*在你的代码中是没有意义的。

+0

为了说明清楚,'void operator =(B * b)'将仅用于** B b; A =&b;' – NtscCobalt

您已经指定了指针而不是对象。只需更换与最后一个指令: *a = b;

要回答的第二个问题:NULL可以在编译器不止一种方式来定义(如最新的标准,无论是作为整体0或文字nullptr)。指针也可以转换为其他类型的指针,但是将void*传递给一个采用int*long*的重载函数可能会使编译器无法解析正在调用的函数。

但是,如果您想避免NULL,只需改为operator(B& b)即可。参考文献肯定是指向一个对象。

+1

在C++中,NULL被定义为0.这是唯一合法的定义。 –

+0

我确定在MSVC2008中观察到NULL被定义为'((void *)0)'。 –

+0

在C++中,NULL必须是空指针常量(通常是值为0的整数常量表达式)。与C'((void *)0)不同,它不能被转换,比如没有转换就转换成int *。 –

更改语句分配给到:

*a = b;