Ich habe die folgenden fünf Dateien.
Ich versuche, eine Funktion mithilfe eines two_b.cpp
Rückrufs aufzurufen, erhalte jedoch die folgende Fehlermeldung:one_a.cpp
std::function
terminate called after throwing an instance of 'std::bad_function_call'
what(): bad_function_call
Aborted (core dumped)
ein_a.h
#include <functional>
using CallbackType = std::function<void()>;
class Car {
public:
void car_run(void);
void car_stop(void);
CallbackType f1;
private:
CallbackType callbackHandler;
};
one_a.cpp
#include "one_a.h"
#include <iostream>
void Car::car_run(void)
{
std::cout<<"Car running"<<std::endl;
}
void Car::car_stop(void)
{
std::cout<<"Car stopping"<<std::endl;
}
zwei_b.h
#include "one_a.h"
class Boat {
public:
Boat(Car& car_itf);
static void boat_run(void);
static void boat_stop(void);
private:
Car& car_itf_;
};
two_b.cpp
#include "two_b.h"
#include <iostream>
Boat::Boat(Car& car_itf):car_itf_{car_itf}{
car_itf_.f1 = std::bind(&Boat::boat_run);
}
void Boat::boat_run(void)
{
std::cout<<"Boat running"<<std::endl;
}
void Boat::boat_stop(void)
{
std::cout<<"Boat running"<<std::endl;
}
main.cpp
#include "two_b.h"
int main()
{
Car bmw;
bmw.car_run();
bmw.f1();
return 0;
}
Ein laufendes Beispiel finden Sie hier:
https://www.onlinegdb.com/_uYHXfZsN
Lösung des Problems
std::function
löst eine std::bad_function_call
Ausnahme aus, wenn Sie versuchen, sie aufzurufen, ohne dass ihr ein aufrufbares Ziel zugewiesen ist.
Sie müssen also tatsächlich ein Ziel zuweisen, f1
bevor Sie versuchen, f1
eine Funktion aufzurufen. Sie nehmen diese Zuweisung im Konstruktor von vor, also müssen Sie zuerst ein Objekt Boat
erstellen, z.Boat
int main()
{
Car bmw;
Boat ferry(bmw); // <--
bmw.car_run();
bmw.f1();
return 0;
}
Online-Demo
Stellen Sie außerdem sicher, dass Sie den Destruktor von löschen f1
, damit Sie das Dangling Boat
nicht verlassen, z.f1
Boat::~Boat(){
car_itf_.f1 = nullptr;
}
Keine Kommentare:
Kommentar veröffentlichen