题
假设我有以下声明:
class Over1
{
protected:
class Under1
{
};
};
我知道我可以执行以下操作:
class Over2 : public Over1
{
protected:
class Under2 : public Under1
{
};
};
但是有没有办法在不声明 Over2 的情况下声明 Under2 呢?
由于您必须扩展 Over1 才能使用 Under1 的任何导数,这可能看起来很愚蠢,但在这种情况下可能有 30 种不同风格的 Under。我可以:
- 将它们全部放入 Over1 中:没有 有吸引力,因为 Over2 只能使用 其中 1 或 2 个
- 把它们分别放在 他们自己版本的 Over :没有 自此,你将拥有 几乎从 同班同学。
- 想办法创造 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
{
};
希望这可以帮助。
其他提示
比创建嵌套类更好的是,您可能希望考虑将这些闭包嵌入到命名空间中。这样,您就不需要外部类来获取内部类。有一些很好的论据支持和反对 谷歌 C++ 风格指南.
如果您想保护 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
{
};
尽管这会将所有 Over1 的隐私暴露给 Under2 - 这不太可能是您想要的。
对我来说听起来有点时髦的设计。为什么不尝试以不同的方式构建代码呢?我认为这可能是装饰器模式的一个很好的候选者,您可以将基类包装在各种装饰器中以实现所需的功能,“under”的各种风格都可以是装饰器。只是一个想法,如果不了解更多代码的意图,很难说清楚。
不隶属于 StackOverflow