У меня есть занятия, 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
.Но почему происходит эта ошибка?