专用模板类循环依赖关系
Specialized template classes cyclic dependency
我有一个令人生畏的设计问题,我正在寻求一些建议。简而言之,我有两个基类A
和B
,以及分别继承自A
和B
的AImpl<T>
和BImpl<T>
。我需要的是从多态A*
指针指向的AImpl<T>
对象中检索一个(静态)BImpl<T>*
,但不需要在A
中显式添加类似virtual B* getB()
的内容,并在AImpl<T>
中覆盖它,因为B
和BImpl<T>
已经依赖于A
,这将添加循环依赖关系。AImpl<T>
和BImpl<T>
都专门用于基元类型,std::string、T*
等。
有什么好建议吗?
Edit:forward声明在这里没有用处,因为即使在A.h中添加B的f.d.,并将方法virtual B*getB()放在A中,作为一个模板类,它也需要对该方法进行完整的定义。getB()应该返回一个BImpl的静态实例。
为了用其他术语解释这个问题,会发生以下情况:在用户cpp中,我包含a.h并使用a类。假设AImpl将方法getB()定义为
const B* getB() const {
static BImpl<T> instance;
return &instance;
}
这种方法需要完全包含B.h,从而导致循环依赖性。
编辑2,完整代码示例我将尝试把它放在一个简单的代码示例中,希望能更好地解释我的担忧。
// File A.h
struct A
{
virtual ~A();
void const A* getChild() const { /* ... */}
virtual const B* getB() const = 0;
};
template <typename T>
struct AImpl : public A
{
const B* getB() const
{
return getBImpl_of<T>();
}
};
// Specializations of AImpl<T>
template<typename T>
const A* getAImpl_of()
{
static AImpl<T> instance;
return &instance;
}
// File B.h
struct B
{
template<typename T>
static void work()
{
getBImpl_of<T>()->doWork();
}
virtual ~B();
protected:
virtual void doWork() = 0;
};
template <typename T>
struct BImpl : public B
{
protected:
void doWork()
{
const A* pA = getAImpl_of<T>();
// ... do something with pA ...
// Here is the key point:
const A* pChild = pA->getChild();
pChild->getB()->doWork();
}
};
template<typename T>
const B* getBImpl_of()
{
static BImpl<T> instance;
return &instance;
}
这是我想做的,但很明显,在B.h中包含A.h,反之亦然会导致循环依赖。请注意,这并不完全是我所拥有的,但显示了相同的问题。非常感谢。
Forward声明应该很好,因为模板方法在使用之前不会实例化。
试着把这个放在你的A.h:的顶部
struct B;
template <typename T> const B* getBImpl_of();
则可以在B.h中包含A.h。
相关文章:
- C++GTKMM gui循环依赖关系
- 如何在头文件中声明类模板(由于循环依赖关系)
- 对在不同二进制文件中创建的对象文件的依赖关系
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 模拟测试中类的依赖关系
- C++模板方法中的循环依赖关系
- 解析正交模块的依赖关系
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- Wt::D bo 中的循环依赖关系
- 在包含窗口标头时难以解决循环依赖关系问题
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 解决循环依赖关系 c++ 的想法
- C++循环依赖关系,未声明的标识符
- C++ 中的循环依赖关系问题
- 为什么包含需要进一步的依赖关系?
- 使用 cmake 获取外部依赖关系
- CMake 外部和内部静态库的循环依赖关系
- 在没有Xcode的macOS中开发具有依赖关系的应用程序
- "std::shared_ptr"循环依赖关系是如何导致问题的