【问题标题】:C++ Overloading assignment operator: "cannot convert `B*` to `A*`" errorC++ 重载赋值运算符:“无法将 `B*` 转换为 `A*`”错误
【发布时间】:2012-09-03 18:26:47
【问题描述】:
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;

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

【问题讨论】:

  • 你的重载分配给A,而不是A*
  • 您将指向B 的指针分配给指向A 的指针,这与将B 分配给A 不同。
  • 谢谢大家。菜鸟失误!
  • @nahpr 请考虑选择以下答案之一作为接受的答案。

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


【解决方案1】:

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

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

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

【讨论】:

  • 在 C++ 中,NULL 被定义为 0。这是唯一合法的定义。
  • 我确实观察到 NULL 在 MSVC2008 中被定义为 ((void*)0)
  • 在 C++ 中,NULL 必须是一个空指针常量(通常是一个值为 0 的整数常量表达式)。与 C 中不同,((void*)0) 无效,它不能在没有强制转换的情况下转换为 int*
【解决方案2】:

您的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* 在您的代码中毫无意义。

【讨论】:

  • 为了帮助澄清,void operator=(B *b)用于以下B b; A a = &b;
【解决方案3】:

更改分配给 a 的语句:

*a = b;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2013-03-30
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多