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



下面显示的是程序的大致结构。

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,以便在Room中创建类型为Node的变量,并且Node除了在Room中之外不能在任何地方使用。请注意,在每个实例Room中,我需要一个类型为Node的链表。

  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;
};

相关内容

最新更新