3

假设我有以下声明:

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 版本中:从那以后就没有吸引力了,您将不得不从几乎同一个类中多次继承。
  • 找到一种方法来创建 Under1 的子代而不创建 Over1 的子代

那么这可能吗?

谢谢。

4

4 回答 4

1

比创建嵌套类更好,您可能希望将这些类嵌入到命名空间中。这样,您就不需要外部类来获取内部类。在Google C++ Style Guide中有一些很好的支持和反对的论据。

于 2008-09-30T16:09:32.720 回答
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
{
};

希望这可以帮助。

于 2008-09-30T16:23:31.067 回答
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
{
};

尽管这会将所有 Over1 的私人信息暴露给 Under2 - 这可能不是您想要的。

于 2008-09-30T16:26:05.287 回答
0

对我来说,这听起来像是一个时髦的设计。为什么不尝试以不同的方式构建代码。我认为这可能是装饰器模式的一个很好的候选者,您可以将基类包装在各种装饰器中以实现所需的功能,“under”的各种风格可能是装饰器。只是一个想法,如果不了解代码的意图,很难说清楚。

于 2009-06-08T22:53:22.407 回答