передача аргумента — C ++, как передать this для ссылки на указатель

у меня есть основной класс, который мне нравится передавать ссылку на указатель на один из объектов, которые я создаю, но это дает мне ошибку:

Ошибка 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 материал)

4

Решение

Во-первых, тип 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),

5

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

я не знаю почему ты используешь *& но это будет хорошо работать, если вы делаете:

GameController(GameLayer* GameLayer)
{
setGameLayer(gameLayer); // to GameLayer memeber )
}
5

‘this’ является константой указателя, поэтому вы можете передать ее в качестве ссылки или константы.

 m_pGameController = new GameController(*this);

GameController(GameLayer& GameLayer) {}
1

Ответ «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 говорит вам, к какому объекту вызывается текущая функция-член, и вы не можете внезапно решить, что ваша функция-член отныне будет работать с другим объектом.

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