Назначение std :: function не имеет никакого эффекта в Win32 приложении Visual C ++ 2015 - PullRequest
0 голосов
/ 06 декабря 2018

Вот мой сценарий:

main.cpp

#include <Windows.h>
#include <functional>

std::function<void()> OnPrepare;

int WINAPI WinMain(HINSTANCE inst, HINSTANCE preInst, TCHAR*, int) {
    if (OnPrepare) {
        OnPrepare();
    }

    return 0;
}

other.cpp

#define _AFXDLL
#include <afx.h>  // TRACE
#include <functional>

extern std::function<void()> OnPrepare;

class Init {
public:
    Init() {
        OnPrepare = []() {
            TRACE("hello, world!\n");
        };
    }
};

Init g_init;

Этот код не работает в приложении Win32, но работает хорошов консольном приложении.Я не знаю почему.Кто-нибудь может указать, что не так с моим кодом?Если я не могу сделать это так, есть ли лучший способ?

РЕДАКТИРОВАТЬ:

OnPrepare всегда пусто в приложении Win32, поэтому "hello, world" не появится.

1 Ответ

0 голосов
/ 06 декабря 2018

Код для построения g_init изменяет OnPrepare.Это, конечно, допустимо, только если OnPrepare уже построено.Но что, если g_init построен до OnPrepare?Затем вы будете модифицировать объект, который еще не был создан, а затем создадите уже измененный объект.Уч.Выполнение реальной работы в конструкторах статических объектов никогда не является хорошей идеей.

Не ясно, какова ваша внешняя проблема, но этот код не является хорошим способом ее решения.Ужасный обходной путь - заменить глобальную std::function глобальной функцией, которая возвращает ссылку на статическую функцию std::function, и использовать ее.Это гарантирует, что объект создается до того, как ему присвоить.

std::function<void()>& getOnPrepare()
{
    static std::function<void()> OnPrepare;
    return OnPrepare;
}

Тогда конструктор Init может вызвать getOnPrepare, гарантируя, что OnPrepare создан до того, как ему присвоено:

Init() {
    getOnPrepare() = []() {
        TRACE("hello, world!\n");
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...