我很好奇是否有一种优雅的方法来解决c ++中的以下问题:
我有一个模拟器应用程序,其中包含通过通道连接的几个组件.通道可以是网络通道(需要app的两个实例)或虚拟本地通道.有两个接口:IChannelIn和IChannelOut和两个相应的变量:
IChannelIn* in;
IChannelOut* out;
Run Code Online (Sandbox Code Playgroud)
这DummyChannel是IChannelIn和IChannelOut.它只是将输入复制到输出.还有TCPChannelIn: public IChannelIn和单独的TCPChannelOut: public IChannelOut.
现在,根据用户的选择,我要么创建一个 DummyChannel
DummyChannel* d = new DummyChannel;
in = d;
out = d;
Run Code Online (Sandbox Code Playgroud)
或两个单独的对象: in = new TCPChannelIn; out = new TcpChannelOut
问题是:析构函数应该做什么?
~App::App()
{
delete in;
delete out;
}
Run Code Online (Sandbox Code Playgroud)
以错误结束,因为delete in;删除了虚拟通道,d以便delete out删除已经删除的东西.
这有一种优雅的方式吗?
你需要的东西是:
~App::App()
{
if (in != out)
{
delete out;
}
delete in;
}
Run Code Online (Sandbox Code Playgroud)
当通道不同时,指针将是不同的.
然而,随着danatel已经指出了意见in,并out没有可比性.安全(但不优雅)的解决方案是使用dummy旗帜.设置if in和out设置为虚拟通道,析构函数将变为:
~App::App()
{
if (!dummy)
{
delete out;
}
delete in;
}
Run Code Online (Sandbox Code Playgroud)
虽然我对此不满意.
唯一的其他解决办法,我可以看到目前是改变的定义IChannelIn,并IChannelOut让他们可以安全地进行比较.