假设我有以下声明:
class Over1
{
protected:
class Under1
{
};
};
我知道我可以做以下事情:
class Over2 : public Over1
{
protected:
class Under2 : public Under1
{
};
};
但是有没有办法在没有Over2的情况下声明Under2?
由于您必须扩展Over1以使用Under1的任何衍生物,这可能看起来很愚蠢,但在这种情况下可能会有30种不同的Under。我可以:
这可能吗?
感谢。
答案 0 :(得分:1)
比创建嵌套类更好,您可能希望将这些关闭嵌入到命名空间中。这样,您不需要外部类来获取内部类。 Google C++ Style Guide中有一些很好的论据支持和反对。
答案 1 :(得分:1)
使用模板和显式特化,只需在Over1中添加一个类声明即可。
class Over1
{
protected:
class Under1
{
};
template <typename T>
class UnderImplementor;
};
struct Under2Tag;
struct Under3Tag;
struct Under4Tag;
template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};
template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};
template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};
希望这有帮助。
答案 2 :(得分:0)
如果要保持Under1受保护,那么根据定义,您需要从Over1继承才能访问它。我建议将Under1公开,或者像Douglas建议的那样使用命名空间。
我现在没有编译器来测试这些,所以我不确定这些是否可行,但你可以试试这个:
class Over1
{
protected:
class Under1
{
};
public:
class Under1Interface : public Under1
{
};
};
class Under2 : public Over1::Under1Interface
{
};
也许是这样的:
class Over1
{
protected:
class Under1
{
};
};
class Under2 : private Over1, public Over1::Under1
{
};
甚至:
class Under2;
class Over1
{
friend class Under2;
protected:
class Under1
{
};
};
class Under2 : public Over1::Under1
{
};
虽然这会将所有Over1s私有暴露给Under2 - 不太可能是你想要的东西。
答案 3 :(得分:0)
听起来像是一个时髦的设计。为什么不尝试以不同方式构建代码。我认为这可能是装饰器模式的一个很好的候选者,你可以将你的基类包装在各种装饰器中以实现所需的功能,'under'的各种风格可能是装饰器。只是一个想法,很难在不了解您的代码意图的情况下进行分析。