下面显示的是程序的大致结构。
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
问题:
我应该如何准确地封装
Node
,以便在Room
中创建类型为Node
的变量,并且Node
除了在Room
中之外不能在任何地方使用。请注意,在每个实例Room
中,我需要一个类型为Node
的链表。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;
};