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

问题描述

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

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内部以外,其他地方均未使用它。我试图通过使其成为嵌套类来封装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,以便可以在Node内创建类型为Room的变量,并且不能在任何地方使用Node除了Room内部。请注意,在每个实例Node中,我将需要一个类型为Room的链表。

  2. 应该像现在一样将Node的方法移动到外部.cpp文件吗?这是个好习惯吗?

解决方法

对嵌套类的声明进行词法分析(与文件作用域相同)。只需在定义后移动Node的用法:

class Room 
{  
  private:

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

  public:
     // ...
};

由于Node仅在Room内部使用,因此应为private


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

,

您必须至少声明一个类型,然后才能使用它:

class Room 
{


public:
    void roomMethod();

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

};

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...