我在复制和找到错误的原因方面遇到了很大的问题.出现似乎是完全随机的,所以我怀疑某处有一个未初始化的变量.但后来我发现了这段代码:
CMyClass obj; // A
obj.DoStuff();
if ( somebool )
{
CMyClass obj; // B
obj.DoStuff();
}
obj.DoOtherStuff();
Run Code Online (Sandbox Code Playgroud)
似乎DoOtherStuff()要么在"B"上完成,要么B.DoStuff()有时实际上在A上工作 - 即我实际上在第一个obj上调用了DoStuff().
这会发生吗?我不认为我收到了编译器警告(我现在修改了代码,希望它可能有所帮助).看起来很可能这段实际代码是我试图找到的bug的地方,但当然还有其他原因我尚未发现.
编写的代码应该可以工作.第一次呼叫DoStuff()和最后一次呼叫DoOtherStuff()只能发送到A.
只能发送到块DoStuff()内的调用.if(somebool) { }B
从标准:
3.3.2本地范围
- 块(6.3)中声明的名称是该块的本地名称.它的潜在范围从声明点(3.3.1)开始,到声明区域结束时结束.
和:
3.3.7名称隐藏
- 名称可以通过嵌套声明性区域或派生类(10.2)中相同名称的显式声明来隐藏.
话虽如此,也许这不是该代码作者的意图.如果变量具有相同的名称,则意图可能只有该变量的一个实例,并且B在循环内创建的实例是错误的.你是否经历过逻辑,看看第二个实例是否有意义?