假设我有以下声明:

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”的各种风格都可以是装饰器。只是一个想法,如果不了解更多代码的意图,很难说清楚。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top