1

我对作用域应该如何在 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

4 回答 4

4

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

但是,std::string可以很容易地分配给,所以只需使用它:

finalStr = curLine;
于 2013-08-26T22:46:34.977 回答
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
于 2013-08-26T22:49:01.957 回答
1

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

finalStr= curLine ;

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

于 2013-08-26T22:44:15.417 回答
1

std::string finalStr(curLine);

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

将行更改为此

finalStr = curLine

这将复制curLinefinalStr您在顶部声明的内容中。

于 2013-08-26T22:46:00.000 回答