C++ C++;如何通过';这';指向指针引用

C++ C++;如何通过';这';指向指针引用,c++,argument-passing,this-pointer,C++,Argument Passing,This Pointer,我有一个主类,我喜欢在我创建的对象上传递它的指针引用,但它给了我错误: 错误1错误C2664:'GameController::GameController(GameLayer*&'): 无法将参数1从“GameLayer*const”转换为“GameLayer*&” 游戏层(主要对象)中的内容 在游戏控制器中,我有一个构造函数 GameController(GameLayer*& GameLayer) { setGameLayer(gameLayer); // to GameLaye

我有一个主类,我喜欢在我创建的对象上传递它的指针引用,但它给了我错误:

错误1错误C2664:'GameController::GameController(GameLayer*&'): 无法将参数1从“GameLayer*const”转换为“GameLayer*&”

游戏层(主要对象)中的内容

在游戏控制器中,我有一个构造函数

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

原因是我需要能够从GameController(GUI工具)修改GameLayer中的数据

我不知道您为什么要使用
*&
,但如果您这样做,它会工作得很好:

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

“this”是指针常量,因此可以将其作为引用或常量引用传递

 m_pGameController = new GameController(*this);

 GameController(GameLayer& GameLayer) {}

首先,根据成员函数是否为
const
,此
的类型可以是
GameLayer*const
const GameLayer*const
。但是,它是一个
const
指针

话虽如此,引用指针
type*&ref
表示您将修改指针,即它所指向的对象

“因为,此指针是常量指针,所以不能在引用的上下文中将其分配给非常量指针(GameLayer*p)”

在引用指针的情况下,您不能指定一个引用,该引用将修改
中的值。您不能将其分配给对
非常量(
GameLayer*&p)
指针的引用,但可以将其分配给
const
指针的引用,即
GameLayer*常量&p

因此,将构造函数更改为
GameController(GameLayer*const&GameLayer)
应该可以工作。
但是我现在看不到它在这里有任何用处

如果您是从
const
成员函数调用,那么
这个
的类型是
const*const
,因此您必须将其更改为
GameController(const-GameLayer*const&GameLayer)
“不知道名字”的答案几乎肯定是您所需要的,但是对于其他信息,代码不起作用的原因是
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";
}
void foo(游戏玩家*&layerpter){
layerpter=新游戏层();
}
void main(){
游戏玩家*ptr=0;

std::cout为什么它需要作为一个引用?我打赌它可能不是。
这个
不是一个
GameLayer*&
。它是一个
GameLayer*
const GameLayer*
,这取决于当前运行方法的常量。另外,请注意,您使用的不是一个变量,而是一个
GameLayer*
在构造函数中命名自己。
GameController(GameLayer*&GameLayer)
不应该是
GameController(GameLayer*&GameLayer)
请避免使用指针:GameController(GameLayer&GameLayer)而不是m\u GameController=GameController(*此)-这并不能解决常量的正确性。如果不将
作为引用传递,则将
*此
作为引用传递。这是完全有效的,但不是问题所在。同意,但我使用了引用,因为它更依赖于C++。如果执行
新游戏控制器(此)
的方法是
常量
(在提问者的情况下,这似乎是正确的),那么
这将是一个
const GameLayer*
GameController
的构造函数(或重载)应该采用
const GameLayer*
@FrédéricHamidi该方法在提问者的情况下不是
const
。你可以从错误消息中看出。
这个
可以是
GameLayer*const
const GameLayer*const
@FrédéricHamidi不,它们不一样。
GameLayer*const
是指t它的指针是常量,但它指向的值不是常量。@interjay,Itachi和你是对的。我想我需要更多的茶。”因为,这个指针是常量指针,你不能将它分配给非常量指针(GameLayer*p)"--是的,你可以。具体地说:可以用来初始化
GameLayer*
的所有东西的集合与可以用来初始化
GameLayer*常量的所有东西的集合是相同的。该位置的
常量只影响你是否可以分配给
p
,而不影响你可以初始化它的内容与。初始化
GameLayer*&
和初始化
GameLayer*const&
之间的区别正如你所说。@SteveJessop:是的,我同意。但是上面写的不是真的吗?@Uchia:不,你写的不全是真的。不正确的部分是,“因为这个指针是一个常量指针,所以你不能将它分配给一个非常量指针(GameLayer*p),但你可以将它分配给常量指针(GameLayer*const p)。@SteveJessop:请你指出,我找不到你。
void foo(GameLayer *&layerptr) {
    layerptr = new GameLayer();
}

void main() {
    GameLayer *ptr = 0;
    std::cout << (void*)ptr << "\n";
    foo(ptr);
    std::cout << (void*)ptr << "\n";
}