我对范围应该如何在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语句中复制构造函数来复制我的字符数组。有没有解决的办法?谢谢你的阅读..
答案 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
。