Каков синтаксис для настройки и вызова закрытой функции-члена в A из B с использованием указателя функции? - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь создать функцию обратного вызова, которую Foo может вызывать в Bar.Я сталкиваюсь с "Ошибка проверки времени выполнения # 0".Я провел некоторое исследование по этому поводу, но оно мне не показалось, поэтому я отправляю этот вопрос.

Сначала я столкнулся с этой проблемой, пытаясь настроить триггерную игровую систему для моего хобби-проекта вUE4, я просто упростил код, чтобы опубликовать его здесь.

Класс Foo:

#pragma once

class Bar;

class Foo
{
public:

    Foo(Bar* bar);
    ~Foo(){}    

private:

    void TestCB();

};

cpp:

#include "Foo.h"

#include <iostream>

#include "Bar.h"

Foo::Foo(Bar* bar)
{
    bar->SetUpCallback(this, &Foo::TestCB);
}

void Foo::TestCB()
{
    std::cout << "It Actually Works!";
}

Класс бара:

#pragma once

class Foo;

class Bar
{
public:

    typedef void (Foo::*VoidFuncPtrNoParams)(void);

    Bar() {}
    ~Bar() {}

    void SetUpCallback(Foo* owner, VoidFuncPtrNoParams callback);
    void CallCB();

private:

    Foo* CBOwner;
    VoidFuncPtrNoParams CBToCall;
};

cpp:

#include "Bar.h"

#include "Foo.h"

void Bar::SetUpCallback(Foo* owner, VoidFuncPtrNoParams callback)
{
    CBOwner = owner;
    CBToCall = callback;
}

void Bar::CallCB()
{
    (CBOwner->* (CBToCall))();
}

main:

#include "Foo.h"
#include "Bar.h"

int main()
{
    Bar* bar = new Bar();
    Foo* foo = new Foo(bar);
    bar->CallCB();

    delete bar;
    bar = nullptr;
    delete foo;
    foo = nullptr;

    return 0;
}

Я, очевидно, ожидаю, что он выдаст «Это на самом деле работает!», Однако, он сталкивается с ошибкой во время выполненияпытаясь выйти из конструктора Foo.

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