Возможно глупый вопрос, не судите строго. В общем, у меня есть объект на него нужно передать ссылку этого-же типа. Думаю код лучше вам объяснит ситуацию:
class ObjA{
};
class ObjB{
ObjA *a;
public:
ObjB(const ObjA& _a){
a = _a;
}
};
При таком коде вылетает такая ошибка: "cannot convert ‘const ObjA’ to ‘ObjA*’ in assignment". Я как понимаю ошибка в том что невозможно сконвертировать ссылочный тип к обычному. P.S Ещё раз извиняюсь за мои возможные ошибки в тексте, из-за непонимания работы С++. Буду рад почитать в комментариях поправки.
Ну смотрите: у вас в объекте хранится УКАЗАТЕЛЬ на ObjA, в то же время в конструктор вы передаете ССЫЛКУ на ObjA. У вас несовпадение типов, так как нельзя конвертить ссылку к указателю. Сдесь у вас два варианта:
1) взять адрес OjbA и присвоить его указателю. Так как адрес ссылки == адресу переменной, то это не проблема, но у вас указатель на неконстантный объект ObjA, а в конструктор вы передаете константную ссылку, так что либо вы снимаете константность с ссылки, либо добавляете ее к указателю
2) Хранить в ObjB ссылку, а не указатель. Да, так можно (ссылка это фактически указатель, который не нужно разыменовывать и который не может быть nullptr(на самом деле может быть, но это другая история)), так что вы можете хранить ссылку в объекте при условии, что она будет инициализирована в конструкторе. По поводу константности - смотрите пункт 1.
В конечном итоге у вас должно получиться что-то вроде:
class ObjA{
};
class ObjB{
const ObjA *a;
public:
ObjB(const ObjA& _a){
a = &_a;
}
};
или
class ObjA{
};
class ObjB{
const ObjA &a;
public:
ObjB(const ObjA& _a){
a = _a;
}
};
PS в конечном итоге вариант, который стоит выбрать, зависит от изменяемости переменной, ссылающейся на ObjA - если в ObjB она может быть изменена (имеется ввиду не объект по указателю, а сам указатель), то стоит выбрать вариани с указателем, иначе можно выбрать ссылку.
Во-первых, забыли взятие адреса: a = &_a;
Во-вторых, нужно либо убрать const с const ObjA& _a, либо добавить его к ObjA *a;.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей