如何封装仅在另一个 class 中使用的 class?

How to encapsulate a class that is only being used inside another class?

下面显示的是程序的粗略结构。

class Room 
{
private:
    Node* content;
public:
    void someRoomMethod();
};

void Room::someRoomMethod() {}


class Node
{
private:
    Node* nextNode;
    std::variant<int, float> data;
public:
    void someNodeMethod();
};

void Node::someNodeMethod() {}

正如我在标题中提到的,Node 除了在 Room 内部之外,没有在任何地方使用。我试图通过使它成为一个嵌套的 class 来封装 Node,但它没有用。

// Room.hh

class Room 
{
private:
    Room::Node* content; // ERROR: no type named "Node" in "Room" -- GCC

public:
    void roomMethod();

    class Node()
    {
    private:
        Node* nextNode;
        std::variant<int, float> data;
    public:
        void someNodeMethod();
    }
};

// Room.cpp
void Room::someRoomMethod() {} // sees Room in Room.hh

// Node.cpp
void Room::Node::someNodeMethod() {} // sees Node in Room.hh

问题:

  1. 我究竟应该如何封装 Node 以便我可以在 Room 中创建一个 Node 类型的变量,这样 Node 就不能'除了 Room 之外的任何地方都不能使用。请注意,在每个实例 Room.

    中,我需要一个类型为 Node 的链表
  2. Node 的方法是否应该像现在这样移动到外部 .cpp 文件?这是一个好习惯吗?

嵌套 class 的声明按词法解析(与文件范围相同)。只需在定义后移动 Node 的用法:

class Room 
{  
  private:

    class Node
    {
      // ...
    };
  
    Room::Node* content; // fine, Node is defined already

  public:
     // ...
};

因为Node只在Room内部使用所以应该是private.


是的,您应该将 Node 方法的定义移动到 .cpp 文件中,以分离实现和接口。这与常规 class 方法相同。

你至少要声明一个类型才能使用它:

class Room 
{


public:
    void roomMethod();

    class Node                          // no () 
    {
    private:
        Node* nextNode;
        std::variant<int, float> data;
    public:
        void someNodeMethod();
    };                                  // missing ;
private: 
    Node* content;

};