gpt4 book ai didi

c++ - 为什么此代码的打印顺序不符合我的预期?

转载 作者:行者123 更新时间:2023-11-28 02:19:30 25 4
gpt4 key购买 nike

我有一个类系统(ISystem 作为接口(interface)),它包含一个 Controller ,ControllerA 或 ControllerB。系统可以通过调用 stateChanged 来切换 Controller :

#include <stdio.h>
class ISystem{
public:
virtual void stateChanged(int state)=0;
};

class Controller{};

class ControllerA : public Controller{
public:
ControllerA(ISystem* system){
system->stateChanged(1);
}
};

class ControllerB : public Controller{
public:
ControllerB(ISystem* system){}
};

class System : public ISystem{
protected:
Controller* controller;
public:
System(){this->controller=NULL;}
void stateChanged(int state){
if(controller!=NULL){
delete controller;
}
switch(state){
case 0:
controller=new ControllerA(this);
printf("state 0 with ControllerA\n");
break;
case 1:
controller=new ControllerB(this);
printf("state 1 with ControllerB\n");
break;
}
}
};

在主体上,我创建一个系统并将其设置为状态 0,然后它应该先创建 Controller A,然后在 Controller A 中调用 stateChanged(1) 以切换到 Controller B:

int main(){
System system;
system.stateChanged(0);
return 0;
}

所以我希望输出是:

state 0 with ControllerA
state 1 with ControllerB

但是结果输出顺序是:

state 1 with ControllerB
state 0 with ControllerA

为什么会这样?

最佳答案

因为当你输入这个:

case 0:
controller=new ControllerA(this);
printf("state 0 with ControllerA\n");
break;

它首先调用 A 的 c-tor,它调用这个:

system->stateChanged(1);

依次这样做:

case 1:
controller=new ControllerB(this);
printf("state 1 with ControllerB\n");
break;

警告

但这实际上意味着A 对象上的delete从其构造函数内部 调用的,这听起来有点不对。您可能需要重新考虑这个想法(从“原始指针不应该拥有资源”指南开始)。

关于c++ - 为什么此代码的打印顺序不符合我的预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33035307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com