GOOGLE ADS

Montag, 18. April 2022

c++ std::Funktionsrückruf

Ich habe die folgenden fünf Dateien.

Ich versuche, eine Funktion mithilfe eines two_b.cppRückrufs aufzurufen, erhalte jedoch die folgende Fehlermeldung:one_a.cppstd::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::functionlöst eine std::bad_function_callAusnahme aus, wenn Sie versuchen, sie aufzurufen, ohne dass ihr ein aufrufbares Ziel zugewiesen ist.

Sie müssen also tatsächlich ein Ziel zuweisen, f1bevor Sie versuchen, f1eine Funktion aufzurufen. Sie nehmen diese Zuweisung im Konstruktor von vor, also müssen Sie zuerst ein Objekt Boaterstellen, 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 Boatnicht verlassen, z.f1

Boat::~Boat(){
car_itf_.f1 = nullptr;
}

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...