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;
Какой оператор «=» будет использоваться?
Ваш 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*
не будет иметь никакого смысла в вашем коде.
Вы назначили указатель вместо объекта. Просто замените последнюю инструкцию на:
*a = b;
Чтобы ответить на второй вопрос: НОЛЬ может быть определено более чем одним способом в компиляторе (по состоянию на последний стандарт, либо в качестве интегрального 0
или буквальный nullptr
). Указатели также можно приводить к указателям других типов, но передавая void*
перегруженной функции, которая принимает int*
или long*
может сделать компилятор неспособным разрешить вызываемую функцию.
Однако, если вы хотите избежать NULL, просто сделайте operator(B& b)
вместо. Ссылки обязательно указывают на объект.
Измените свое утверждение, которое присваивает a:
*a = b;