Функциональные указатели C ++ в совместно зависимых классах - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть занятия, A и B.На самом деле существует много других классов, которые все имеют указатель на A, потому что A является своего рода менеджером, который контролирует все другие классы во время выполнения.

Идея состоит в том, что A и B оба открывают кучу файловых операций ввода-вывода в течение своей жизни, но любой класс может запросить остановку выполнения.На данный момент, я хотел бы изящно закрыть все файлы, которые открыты.B и все другие классы содержат функцию-член, такую ​​как

void B::CloseFile()

Так что моя идея заключалась в том, чтобы я сначала создал A, который содержит пустой вектор CloseFile указателей на функции, а затем создал все последующиеклассы, которые "регистрируют" свои собственные Close функции в векторе A.Тогда любой класс может вызвать остановку и вызвать A (поскольку все классы имеют указатель на функцию A) CloseAll, которая пересекает вектор и закрывает все, что у него есть.

Я пыталсяпрототип этого в простом примере, и я застреваю.Вот код, который не работает, последняя строка выдает ошибку.

// Example program
#include <iostream>
#include <string>

using std::cout;

class B;
typedef void (B::*bfnptr)();

class A {
public:
    // Some methods
    void SetBfn(bfnptr new_ptr) { do_b_ = new_ptr; };
    // Some vars
    int a_ = 0;
    bfnptr do_b_ = nullptr;
};

class B {
public:
    // More methods
    void ZeroMe() { b_ = 0; };
    void SetA(A* obj_a) { aptr_ = obj_a; };
    void IncMe(int op) { b_ += op; };
    // More vars
    A* aptr_ = nullptr;
    int b_ = 1;
};

int main()
{
    // Two instances
    A obj_a;
    B obj_b;

    // Setup B to point to A
    obj_b.SetA(&obj_a);

    // Manipulate A through B
    cout << "A var initially: " << obj_a.a_ << "\n";
    obj_b.aptr_->a_ = 10;
    cout << "A var is now: " << obj_a.a_ << "\n";

    // Object b can do things
    cout << "B var initially: " << obj_b.b_ << "\n";
    obj_b.IncMe(1);
    cout << "B var is now: " << obj_b.b_ << "\n";

    // Set A to point to a function in B
    obj_a.SetBfn(&obj_b::ZeroMe);
}

Когда я компилирую это с C ++ 14, я получаю ошибку

 In function 'int main()':
51:19: error: 'obj_b' is not a class, namespace, or enumeration

Thisна самом деле это не мой вопрос;Я не уверен, почему это происходит.Фактический вопрос, который я хотел задать, заключался в том, как обрабатывать циклическую зависимость между классами A и B.Но почему происходит эта ошибка?

...