Как передать объекту ссылку

303
01 июля 2021, 11:40

Возможно глупый вопрос, не судите строго. В общем, у меня есть объект на него нужно передать ссылку этого-же типа. Думаю код лучше вам объяснит ситуацию:

class ObjA{
};
class ObjB{
    ObjA *a;
public:
    ObjB(const ObjA& _a){
        a = _a;
    }
};

При таком коде вылетает такая ошибка: "cannot convert ‘const ObjA’ to ‘ObjA*’ in assignment". Я как понимаю ошибка в том что невозможно сконвертировать ссылочный тип к обычному. P.S Ещё раз извиняюсь за мои возможные ошибки в тексте, из-за непонимания работы С++. Буду рад почитать в комментариях поправки.

Answer 1

Ну смотрите: у вас в объекте хранится УКАЗАТЕЛЬ на 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 она может быть изменена (имеется ввиду не объект по указателю, а сам указатель), то стоит выбрать вариани с указателем, иначе можно выбрать ссылку.

Answer 2

Во-первых, забыли взятие адреса: a = &_a;

Во-вторых, нужно либо убрать const с const ObjA& _a, либо добавить его к ObjA *a;.

READ ALSO
Контент сайта и его фон

Контент сайта и его фон

Я новичок в верстке,так что помидорами не кидайтесь) Как сделаны такие сайты, что слева и справа находится очень длинный фон, а по середине...

79
Некорректное добавление записей в БД

Некорректное добавление записей в БД

Хочу передать значение некоторых полей в таблицу своей БДПроблема в том, что добавляется только две записи и не более, даже если объектов...

105
Зачем докеризация asp.net core создаёт лишнюю директорию?

Зачем докеризация asp.net core создаёт лишнюю директорию?

Пробую упаковать приложение aspnet core в контейнер докер по статье, всё получается, но есть непонятный момент

211
Бесконечный цикл и выполнить запуск метода один раз при обнаружение

Бесконечный цикл и выполнить запуск метода один раз при обнаружение

Пытаюсь сделать программу которая будет отслеживать запуск определённых процессов, если какой-то процесс запустился отследить его и запустить...

78