问题描述
下面显示的是该程序的粗略结构。
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
,以便可以在Node
内创建类型为Room
的变量,并且不能在任何地方使用Node
除了Room
内部。请注意,在每个实例Node
中,我将需要一个类型为Room
的链表。 -
应该像现在一样将
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;
};