Разрешено ли ссылаться на этот указатель и подключать лямбду из конструктора класса? - PullRequest
1 голос
/ 27 марта 2020

Сценарий:
У меня есть класс, как показано ниже, который подключает лямбду в самом конструкторе. И лямбда по очереди вызывает функцию-член класса.

Код:

class SomeClass {
public:
    typedef std::function<void(int)> Callback;
    void ListenForCallback(const Callback& callback) {
        m_callback = callback;
    }
private:
    Callback m_callback;
}

class MyClass {
public:
    MyClass() {
        m_some_class = std::make_unique<SomeClass>();

        // Here in constructor itself I pass this pointer and hooking up to a lambda which calls a member function. Is this legal?
        m_some_class->ListenForCallback([this](int value) {
            std::cout << "Value is: " << value << std::endl;
            TakeAction();
        })
    }

private:
    std::unique_ptr<SomeClass> m_some_class;

    void TakeAction() {
        // Please do something
    }
}

Вопрос:
Я скептически относился к использованию указатель this в самом конструкторе MyClass. И еще больше скептически относится к подключению лямбды, вызывающей члена. Но я обнаружил, что приведенный выше код работает! Я делаю все законно и правильно в приведенном выше коде?

Допустимо ли ссылаться на указатель this в конструкторе класса? * * * * * * * * * sh 1021 * Окружение:
C ++ 14 код, скомпилированный с компиляторами Clang и G CC, чтобы узнать, является ли он действительным / недействительным, и объяснение или обоснование ответа. .

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Может присутствовать в теле любой функции-не c.

Источник: https://en.cppreference.com/w/cpp/language/this

Конструкторы не являются c функциями-членами, поэтому это допустимо.

1 голос
/ 27 марта 2020

Это нормально. Объект класса MyClass существует в этой точке. Таким образом, указатель this действителен, и, конечно, класс someClass также полностью создан.

Единственное, на что следует обратить внимание, это порядок инициализации элемента MyClass - но только действительно в списке инициализаторов, хотя, поскольку вы здесь не используете список инициализаторов, в данном примере это не проблема ...

...