c++ - C++:如何创建两个相互使用的类
问题描述
这个问题只在类相互作为成员类型时给出答案,而不是在它们相互使用函数时给出答案。如何在下面的例子中做到这一点?Bar
是一个单例容器,它处理对所有Bar
s 完成的操作。
// Foo.h
#include "Bar.h"
class Foo {
public:
Foo() { Bar::get_instance()->push_back(this); }
void do_something() {}
};
// Bar.h
#include "Foo.h"
#include <vector>
class Bar {
public:
Bar(const Bar &other) = delete;
void operator=(const Bar &) = delete;
static Bar *get_instance()
{
static Bar bar;
return &bar;
}
void push_back(Foo *foo) { foos_.push_back(foo); }
void do_something_all() { for (Foo *f : foos_) f->do_something(); }
private:
Bar() = default;
std::vector<Foo *> foos_;
};
解决方案
你把它分开。定义类,但将实现部分放在类定义之后。
class Foo {
public:
Foo(); // declare but do not implement
// this can be implemented here since it doesn't need Bar:
void do_something() { std::cout << "Foo::do_something()\n"; }
};
class Bar {
public:
Bar(const Bar&) = delete;
void operator=(const Bar&) = delete;
static Bar& get_instance() { // return a reference instead
static Bar bar;
return bar;
}
// you can store a pointer - but require a reference:
void push_back(Foo& foo) { foos_.push_back(&foo); }
// or else you need to check for nullptr in here:
void do_something_all() { for(Foo* f : foos_) f->do_something(); }
private:
Bar() = default;
std::vector<Foo*> foos_;
};
// Implementation part:
// Here Foo can use Bar
Foo::Foo() {
Bar::get_instance().push_back(*this);
}
推荐阅读
- python - 仅将最后 X 行 csv 转换为 json
- html - 为一个元素分配了不同类别的引导程序,但是当分辨率改变时它没有响应
- reactjs - 对多播响应做出反应订阅
- javascript - undefined 不是对象(评估 'post.profile_picture' )
- liquibase - 如何从数据库中删除最后执行的 liquibase 变更集
- azure-active-directory - Power Automate 自定义连接器 - 令牌无效、无效受众
- java - Spring Boot 的会话过期管理
- python - TypeError:to_csv() 得到了一个意外的关键字参数“startrow”
- java - “没有分配放入队列的东西”是什么意思?
- javascript - 如何在js中访问firebase firestore子集合的数据