有人能告诉我一些很好的资源来理解和使用嵌套类吗?我有一些像编程原理之类的材料,还有像IBM知识中心-嵌套类之类的东西

但我还是搞不懂他们的目的。有人能帮帮我吗?


当前回答

我认为使类成为嵌套类而不仅仅是友类的主要目的是能够在派生类中继承嵌套类。在c++中,友谊是无法继承的。

其他回答

我不经常使用嵌套类,但我偶尔会使用它们。特别是当我定义某种数据类型,然后我想定义一个为该数据类型设计的STL函子。

例如,考虑一个泛型Field类,它有一个ID号、一个类型代码和一个字段名。如果我想通过ID号或名称搜索这些字段的向量,我可以构造一个函子来这样做:

class Field
{
public:
  unsigned id_;
  string name_;
  unsigned type_;

  class match : public std::unary_function<bool, Field>
  {
  public:
    match(const string& name) : name_(name), has_name_(true) {};
    match(unsigned id) : id_(id), has_id_(true) {};
    bool operator()(const Field& rhs) const
    {
      bool ret = true;
      if( ret && has_id_ ) ret = id_ == rhs.id_;
      if( ret && has_name_ ) ret = name_ == rhs.name_;
      return ret;
    };
    private:
      unsigned id_;
      bool has_id_;
      string name_;
      bool has_name_;
  };
};

然后需要搜索这些字段的代码可以使用Field类本身的匹配范围:

vector<Field>::const_iterator it = find_if(fields.begin(), fields.end(), Field::match("FieldName"));

嵌套类对于隐藏实现细节很酷。

列表:

class List
{
    public:
        List(): head(nullptr), tail(nullptr) {}
    private:
        class Node
        {
              public:
                  int   data;
                  Node* next;
                  Node* prev;
        };
    private:
        Node*     head;
        Node*     tail;
};

在这里,我不想公开Node,因为其他人可能会决定使用这个类,这将阻碍我更新我的类,因为公开的任何东西都是公共API的一部分,必须永远维护。通过使类私有,我不仅隐藏了实现,我还说这是我的,我可以随时改变它,所以你不能使用它。

看看std::list或std::map,它们都包含隐藏类(真的吗?)关键是它们可能会也可能不会,但是因为实现是私有的和隐藏的,所以STL的构建者能够在不影响您使用代码的情况下更新代码,或者在STL周围留下许多旧包袱,因为他们需要与一些决定使用隐藏在列表中的Node类的傻瓜保持向后兼容性。

你也可以考虑main函数的first class ass类型,在那里你启动所有需要的类一起工作。例如Game类,初始化所有其他类,如窗口、英雄、敌人、关卡等。这样你就可以从主函数中去掉所有的东西。在这里你可以创建Game对象,也许做一些额外的外部调用与Gemente无关。

我认为使类成为嵌套类而不仅仅是友类的主要目的是能够在派生类中继承嵌套类。在c++中,友谊是无法继承的。

可以使用嵌套类实现Builder模式。特别是在c++中,我个人觉得它在语义上更简洁。例如:

class Product{
    public:
        class Builder;
}
class Product::Builder {
    // Builder Implementation
}

而不是:

class Product {}
class ProductBuilder {}