2013-08-26 37 views
1

我对如何在C++中运行范围感到困惑。现在看来,在我的else语句中,我的finalStr被创建,然后在它离开作用域后立即被销毁。是否可以在C++中增加变量作用域?

std::string finalStr; 
char curLine[128]; 
if(BINARY_ASCII == 1) //ignore this case please :D 
{ 
    cdata = convertBSTRToByteArray(data , numChars); 
} 
else 
{ 
    bstrInputString = (LPCWSTR) data; 

    std::strcpy(curLine, bstrInputString.operator char *()); 
    std::string finalStr(curLine); 

    cout << "data is: " << finalStr.data() << "\n"; //prints the right string 
} 

cout << "string is: " << finalStr.data() << "\n"; //prints nothing except "string is: " 

我该如何解决这个问题?我相信我需要在else语句中的复制构造函数来复制我的字符数组。有没有解决的办法?感谢您的阅读..

+0

你的意思是除了在if语句之外声明该变量吗? –

回答

4

您有finalStr声明了两次,一次在if-else语句之外,一次在里面。在内部作用域中声明的那个将在外部作用域中隐藏隐藏,所以你所拥有的是一个局部变量,它将在封闭大括号的末尾被销毁。

然而,std::string可以分配给容易,所以只需使用:

finalStr = curLine; 
1

这只是在您需要的范围内声明变量的问题。事实上,你已经这样做了。然后,不要再声明它。只需分配一个值。当你再次声明时,会创建一个全新的变量(只是名称相同)。这是失去的第二个变量。

finalStr= curLine ; 

据说第二个变量是“隐藏”或“遮蔽”第一个。

1

std::string finalStr(curLine);

这行创建了一个新的字符串,这恰好具有相同的名称作为您在您的代码的顶部字符串。

行更改为这个

finalStr = curLine

此份curLinefinalStr你已经在顶部声明。

2

在您的代码段(std::string finalStr;)的第一行声明finalStr变量。

然后,在else部分中,声明另一个名为finalStr的变量,该变量在该范围内(else与其匹配的右大括号之后的开始大括号)是本地的。现在这个变量隐藏了第一个,并且在这个范围内的finalStr的引用在声明之后,将引用局部变量,而不是在封闭范围中声明的finalStr

要解决该问题,请不要重新声明该变量,只需将finalStr分配一个新值。

std::strcpy(curLine, bstrInputString.operator char *()); 
finalStr = curLine; 
//  ^^^^^ 
// assign new value instead of creating another variable with the same name 
相关问题