在处理个人项目时,我发现自己处于这样一种情况:我想为我的抽象父类的子类创建可重用的代码块,这些子类可以实现它的一些纯虚方法。为此,我创建了一个在主子类之后继承的中间父类。但是,由于项目中最终子类的性质,除了子类之外的任何对象都可以访问中间父类。结果我创建了这种类结构:
class Foo
{
protected:
class Bar : protected Foo
{
public:
void a()
{
//implementation of a()
}
};
public:
virtual void a() = 0;
virtual void b() = 0;
};
class Beep : public Foo, private Foo::Bar
{
void b()
{
//implementation of b()
}
};
(我知道钻石继承问题以及通过多个来源从祖先类继承而引起的其他问题。出于这个问题的目的,请假设它不是问题,因为它不是焦点。)
在尝试将Foo
定义为Bar
的父级时,上述代码会导致“不允许的不完整类型”错误。有没有办法重构代码以在保持所需的类/可访问性结构的同时消除错误?
虽然我对如何实现我所描述的内容感兴趣(此时主要是由于好奇心),但我会接受替代解决方案,只要它们导致匹配行为,即:代码实现抽象基础的部分class只对在所述基类之后继承的对象可见/可访问。
答案 0 :(得分:1)
您可以转发声明Bar
并在Foo
之后定义。
class Foo
{
protected:
class Bar;
public:
virtual void a() = 0;
virtual void b() = 0;
};
class Foo::Bar : protected Foo
{
public:
void a()
{
//implementation of a()
}
};