如何解决如何封装仅在另一个类中使用的类?
下面显示的是该程序的粗略结构。
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;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。