是否可以在C ++中增加变量范围?

时间:2013-08-26 22:42:53

标签: c++ string scope char stdstring

我对范围应该如何在C ++中起作用感到困惑。现在似乎是在我的else语句中,我的finalStr被创建,然后在它离开范围后立即被销毁。

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语句中复制构造函数来复制我的字符数组。有没有解决的办法?谢谢你的阅读..

4 个答案:

答案 0 :(得分:4)

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

但是,std::string可以轻松分配,所以只需使用:

finalStr = curLine;

答案 1 :(得分: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

答案 2 :(得分:1)

只需在您需要的范围内声明变量即可。事实上,你已经这样做了。然后,不要再声明它。只需为其指定一个值即可。再次声明时,会创建一个全新的变量(只是具有相同名称的变量)。这是失去的第二个变量。

finalStr= curLine ;

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

答案 3 :(得分:1)

std::string finalStr(curLine);

此行创建一个新字符串,恰好与代码顶部的字符串同名。

将行更改为此

finalStr = curLine

这会将curLine复制到您在顶部声明的finalStr