«неконстантная lvalue-ссылка на тип не может быть привязана» ошибка со ссылкой (тип & amp;), но не с указателем (тип *)

Я получаю эту ошибку «Неконстантное значение типа Cell не может привязать временное устройство типа Cell * с этим кодом:

class RegionHolder
{
public:
RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
~RegionHolder();

protected:
Cell & m_RegionCellNOO; // difference is here
};

но не с этим:

class RegionHolder
{
public:
RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
~RegionHolder();

protected:
Cell * m_RegionCellNOO; // difference is here
};

Я не понимаю проблему и очень хотел бы использовать ссылки, а не указатели.

Спасибо

4

Решение

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

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
//                                            ^ no &         ^^ don't forget that

Есть одно предупреждение с использованием ссылок, а не указателей: они не могут быть назначены, так же как и ваш класс. Часто это не проблема; но если вам нужно, чтобы ваш класс был назначаемым, вам нужно будет вместо этого использовать указатель.

5

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

Одинарный & Оператор получает указатель на переменную. Итак, в C ++ (как в C) a = &b получает указатель на b и сохраняет это значение в a, так что если b имеет тип int, a должен быть типа int*, Присвоение ссылок, с другой стороны, неявное, поэтому, если a имеет тип int& тебе просто нужно написать a=b делать a ссылка на b, Так что в вашем случае вам нужно переписать ваш конструктор как

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}

Тем не менее, я думаю, что вам лучше использовать указатели, чем ссылки здесь тем не мение и пытаться использовать C ++, не освоившись с указателями, — очень плохая идея. Поэтому я предлагаю вам потратить время на то, чтобы освоиться с использованием указателей, а не пытаться их избегать.

1

По вопросам рекламы [email protected]