C ++重载赋值运算符:“无法将`B *`转换为'A *`”错误

时间:2012-09-10 20:53:39

标签: c++ operator-overloading assignment-operator

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*”错误。 有办法解决这个问题吗?

现在,如果有办法,如果我使用类似的东西:

a = NULL;

将使用哪个运算符“=”?

3 个答案:

答案 0 :(得分:8)

您已指定指针而不是对象。只需将最后一条指令替换为: *a = b;

回答第二个问题:NULL可以在编译器中以多种方式定义(从最新标准开始,作为整数0或文字nullptr) 。指针也可以转换为其他类型的指针,但是将void*传递给带有int*long*的重载函数可能会使编译器无法解析被调用的函数。

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

答案 1 :(得分:5)

您的operator=提供从B*A的分配。您的代码未提供从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*分配给A*的唯一“有用”方法是B对象派生自A。这似乎不是您正在做的事情,因此将B*分配给A*对您的代码毫无意义。

答案 2 :(得分:2)

将您分配给a的语句更改为:

*a = b;