у меня есть основной класс, который мне нравится передавать ссылку на указатель на один из объектов, которые я создаю, но это дает мне ошибку:
Ошибка 1 ошибка C2664: ‘GameController :: GameController (GameLayer *&) ‘:
невозможно преобразовать параметр 1 из GameLayer * const в GameLayer *&’
что у меня есть в GameLayer (основной объект)
m_pGameController = new GameController(this);
и в GameController у меня есть этот конструктор
GameController(GameLayer*& GameLayer)
{
setGameLayer(gameLayer); // to GameLayer memeber )
}
Resone — мне нужно иметь возможность изменять данные в GameLayer из GameController (GUI материал)
Во-первых, тип this
может быть GameLayer * const
или же const GameLayer * const
в зависимости от того, является ли функция-член const
или нет. Но это const
указатель.
Сказав это, ссылка на указатель type *&ref
означает, что вы будете изменять указатель, объект, на который он указывает.
«Поскольку этот указатель является постоянным указателем, вы не можете присвоить его неконстантному указателю (GameLayer * p)» в контекст ссылок.
В случае ссылок на указатель вы не можете присвоить ссылку, которая изменит значение в this
, Вы не можете присвоить его ссылке на non-const
указатель(GameLayer *&p)
, но вы можете назначить ссылку на const
указатель, т.е. GameLayer *const &p
,
Итак, изменив конструктор на GameController(GameLayer * const & gameLayer)
должно сработать.
Но я не вижу здесь никакого смысла.
И если вы звоните с const
функция-член тогда this
имеет тип const *const
так что вам придется изменить его на GameController(const GameLayer * const & gameLayer)
,
я не знаю почему ты используешь *&
но это будет хорошо работать, если вы делаете:
GameController(GameLayer* GameLayer)
{
setGameLayer(gameLayer); // to GameLayer memeber )
}
‘this’ является константой указателя, поэтому вы можете передать ее в качестве ссылки или константы.
m_pGameController = new GameController(*this);
GameController(GameLayer& GameLayer) {}
Ответ «No Idea For Name» почти наверняка вам нужен, но для дополнительной информации причина, по которой ваш код не работает, заключается в том, что GameLayer*&
это не просто означает, что «я могу изменить объект GameLayer, на который ссылается полученное значение аргумента», это означает, что «мне передана ссылка на указатель на объект GameLayer, который я могу изменить, а также я могу использовать эту ссылку для изменить само значение указателя «.
Так, например:
void foo(GameLayer *&layerptr) {
layerptr = new GameLayer();
}
void main() {
GameLayer *ptr = 0;
std::cout << (void*)ptr << "\n";
foo(ptr);
std::cout << (void*)ptr << "\n";
}
Значение ptr
переменная в main
изменился Это то, для чего нужна передача по неконстантной ссылке, и поэтому вам здесь не нужна передача по неконстантной ссылке. Либо передать указатель на GameLayer
объект (тип GameLayer*
) или ссылка (тип GameLayer&
), не оба.
Причина, по которой он не действителен this
к функции, которая принимает GameLayer*&
в том, что this
не является переменной и ей нельзя присвоить — в жаргоне C ++ это не lvalue, и поэтому вы не можете взять ссылку на lvalue. this
говорит вам, к какому объекту вызывается текущая функция-член, и вы не можете внезапно решить, что ваша функция-член отныне будет работать с другим объектом.