【问题标题】:Separate definition of inner class and enclosing class内部类和封闭类的单独定义
【发布时间】:2017-09-23 17:30:13
【问题描述】:

如果封闭类有一个作为内部类实例的成员变量,那么将内部类和封闭类的定义分成不同的头文件的正确方法是什么?

这是Outer(封闭类)的标头:

//outer.h
#ifndef OUTER_H_INCLUDED
#define OUTER_H_INCLUDED

#include "inner.h"

class Outer
{
    class Inner;

public:
    /* public member functions */

private:        
    Inner inner_instance;
};

#endif

还有Inner的标头:

//inner.h
#ifndef INNER_H_INCLUDED
#define INNER_H_INCLUDED

#include "outer.h"

class Outer::Inner
{
    /* definition */
};

#endif

这不会编译。问题是两个类都必须看到彼此的定义。是否有可能打破循环依赖并仍然保持定义分开?

【问题讨论】:

  • 有些人使用内联文件inner.inl 并直接将文件包含在Outer 的类定义中

标签: c++ header-files inner-classes circular-dependency code-separation


【解决方案1】:

没有。您可以做的最好的事情是存储一个指向内部类的指针(或者可能是引用),这使得Inner 不完整。这通常被称为pImpl 成语。

【讨论】:

  • 我会使用 std::unique_ptr 来实现 pImpl idiom
  • 是的,那将是一个不错的选择。您需要一个允许不完整类型的智能指针。您必须小心 Outer 的构造函数和析构函数 - 它们不能内联。
猜你喜欢
  • 2015-05-21
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2016-11-22
  • 2015-04-16
  • 1970-01-01
相关资源
最近更新 更多