C ++ Оператор присваивания с перегрузкой: & quot; невозможно преобразовать `B *` в `A *` & quot; ошибка

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;

Какой оператор «=» будет использоваться?

4

Решение

Ваш 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* не будет иметь никакого смысла в вашем коде.

5

Другие решения

Вы назначили указатель вместо объекта. Просто замените последнюю инструкцию на:
*a = b;

Чтобы ответить на второй вопрос: НОЛЬ может быть определено более чем одним способом в компиляторе (по состоянию на последний стандарт, либо в качестве интегрального 0 или буквальный nullptr). Указатели также можно приводить к указателям других типов, но передавая void* перегруженной функции, которая принимает int* или long* может сделать компилятор неспособным разрешить вызываемую функцию.

Однако, если вы хотите избежать NULL, просто сделайте operator(B& b) вместо. Ссылки обязательно указывают на объект.

8

Измените свое утверждение, которое присваивает a:

*a = b;
2
По вопросам рекламы [email protected]