2

これは本当にばかげた質問かもしれませんが、私が苦労してきたことです。メソッドで LPWSTR を変更した後、その特定のメソッドのみが変更され、直後に元に戻っているように見えます。グローバル変数が悪であることは知っていますが、かなりのコードを変更する必要があるため、これは私の選択ではありません。これが私がやっていることの例です:

Test.h

static LPWSTR globalStr = L"This shouldn't be here.";

// The ...s are irrelevant code.
class Test {
    public:
        ...
        void changeGlobalStr();
        void testMethod();
        ...
    ...
};

テスト.cpp

#include "Test.h"

Test::changeGlobalStr() {
    string testString("This should be here.");

    // I manipulate testString over the next few lines so a variable is necessary.
    ...

    BSTR bConversion = _com_util::ConvertStringToBSTR(testString.c_str());
    globalStr = bConversion

    // This prints out the correct output.
    wcout << "globalStr in changeGlobalStr(): " << globalStr;
}

SecondTest.cpp

#include "Test.h"

Test::testMethod() {
   changeGlobalStr();
   // Get correct output from the print inside the method.
   wcout << "globalStr in testMethod(): " << globalStr;
   // Now incorrect output is printed.
}

testMethod() は、「これはここにあるはずです」ではなく、「これはここにあるべきではありません」と出力してしまいます。何が間違っているのか完全にはわかりませんが、それは初歩的なもので、C ++で非常に錆びているように感じます。

4

2 に答える 2

5

はい、確かに、LPWSTR のテキストは正しいです:「これはここにあるべきではありません。」問題は、globalStr がグローバルではないことです。これはヘッダーのように定義されstaticているため、各ソース ファイルは globalStr の独自のコピーを取得します。1 つのソース ファイルで変更しても、他のファイルでは変更されません。

これを修正するにexternは、ヘッダーで宣言を行い、1 つのソース ファイルで定義します。

// Test.h:

extern LPWSTR globalStr;

// Test.cpp:

" LPWSTR globalStr = L"これはここにあるべきではありません。"

于 2012-08-13T16:44:19.017 に答える
1

グローバル変数で使用staticすると、グローバルではなくなります。これは、宣言されている翻訳単位 (つまり、ソース ファイル) でのみ定義されます。これはstatic、ヘッダー ファイルで変数を宣言し、それを複数のソース ファイルに含める場合、各ソース フィルにはそれぞれ 1 つの一意の変数があることを意味します。

多分あなたはextern代わりに使うつもりですか?

于 2012-08-13T16:43:34.857 に答える