Я получаю эту ошибку «Неконстантное значение типа 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
};
Я не понимаю проблему и очень хотел бы использовать ссылки, а не указатели.
Спасибо
Вы забыли показать нам определение, но предположительно Region1.m_NOO
является объектом типа Cell
, Ваш первый пример берет его адрес и пытается использовать результирующий указатель для инициализации ссылки. Ссылки инициализируются не из указателей, а из самого объекта:
RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
// ^ no & ^^ don't forget that
Есть одно предупреждение с использованием ссылок, а не указателей: они не могут быть назначены, так же как и ваш класс. Часто это не проблема; но если вам нужно, чтобы ваш класс был назначаемым, вам нужно будет вместо этого использовать указатель.
Одинарный &
Оператор получает указатель на переменную. Итак, в 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 ++, не освоившись с указателями, — очень плохая идея. Поэтому я предлагаю вам потратить время на то, чтобы освоиться с использованием указателей, а не пытаться их избегать.