Могут ли сосуществовать std :: function и наследование? - PullRequest
0 голосов
/ 14 марта 2019

У меня есть один файл с абстрактным классом

struct Abstract {
    virtual bool preflightCheck(void) = 0;
    std::function<void(Abstract *)> didIssueError;
    virtual ~Abstract() {}
}

Один файл с производным классом

class Derived : public Abstract {
    bool preflightCheck(void) {
        if(didIssueError != nullptr)
            this->didIssueError(reinterpret_cast<MediaAssetAbstract*>(this));
    }
}

А потом у меня есть файл, где я называю didIssueError как лямбда

bool testDerived(Abstract & derived) {
    derived.preflightCheck();
    derived.didIssueError = [&derived](Abstract * derived) {
        std::cout << "error" << std::endl;
    };
    return true;
}

int main() {
    auto derived = Derived();
    assert(testDerived(derived));
    return 0;
}    

Если я уберу проверку на nullptr, программа вылетит с сообщением terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call.

Где может быть проблема, пожалуйста? С недоступностью производного класса до didIssueError?

1 Ответ

4 голосов
/ 14 марта 2019

Может ли std::function и наследование сосуществовать?

Конечно.

Если я уберу проверку на nullptr, программа вылетит с сообщением terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call.

Где может быть проблема, пожалуйста?

Проблема в том, что вы вызываете didIssueError перед тем, как назначить ему функцию:

// call:
derived.preflightCheck();

// assignment:
derived.didIssueError = [&derived](Abstract * derived) {
    std::cout << "error" << std::endl;
};

C ++ является процедурным, а не языком потока данных.


P.S. Это:

this->didIssueError(reinterpret_cast<MediaAssetAbstract*>(this));

неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...