9

在考虑一个奇怪问题的“创造性”(即奇怪)解决方案时,一个特殊的想法引发了我的好奇心。这不是我可能会使用的想法,但我仍然想知道根据标准它是否合法。

一个简单的例子是......

class base_t
{
  private:
    //  stuff

  public:
    //  more stuff

    class derived_t : public base_t  //  <--- weirdness here
    {
      //  ...
    };      
};

怪异的一部分——因为derived_t继承自base_twhich contains derived_t,所以看起来像是derived_tcontains 本身。

那么 - 这是一种类似于奇怪重复的模板模式的有效但奇怪和可怕的东西,还是非法的?

编辑- 我也许应该提到我想到这个的原因是试图避免一些命名空间污染。拥有一个类作为成员可以避免引入另一个全局类,但是第二个类需要与第一个类共享很多。

如果它只是一对类,那将不是问题,但这是针对代码生成器的。

4

1 回答 1

9

这是合法的,但可能不是您安排代码的方式。基类在使用时必须是完整的,但直到定义的右大括号才完成。所以尝试前向声明嵌套类:

class base_t
{
  private:
    //  stuff

  public:
    //  more stuff

    class derived_t;
};

class base_t::derived_t : public base_t
{
  //  ...
};      
于 2012-11-11T00:37:56.323 回答