如何封装仅在另一个 class 中使用的 class?
How to encapsulate a class that is only being used inside another class?
下面显示的是程序的粗略结构。
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
内部之外,没有在任何地方使用。我试图通过使它成为一个嵌套的 class 来封装 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 文件?这是一个好习惯吗?
嵌套 class 的声明按词法解析(与文件范围相同)。只需在定义后移动 Node
的用法:
class Room
{
private:
class Node
{
// ...
};
Room::Node* content; // fine, Node is defined already
public:
// ...
};
因为Node
只在Room
内部使用所以应该是private
.
是的,您应该将 Node
方法的定义移动到 .cpp
文件中,以分离实现和接口。这与常规 class 方法相同。
你至少要声明一个类型才能使用它:
class Room
{
public:
void roomMethod();
class Node // no ()
{
private:
Node* nextNode;
std::variant<int, float> data;
public:
void someNodeMethod();
}; // missing ;
private:
Node* content;
};
下面显示的是程序的粗略结构。
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
内部之外,没有在任何地方使用。我试图通过使它成为一个嵌套的 class 来封装 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 文件?这是一个好习惯吗?
嵌套 class 的声明按词法解析(与文件范围相同)。只需在定义后移动 Node
的用法:
class Room
{
private:
class Node
{
// ...
};
Room::Node* content; // fine, Node is defined already
public:
// ...
};
因为Node
只在Room
内部使用所以应该是private
.
是的,您应该将 Node
方法的定义移动到 .cpp
文件中,以分离实现和接口。这与常规 class 方法相同。
你至少要声明一个类型才能使用它:
class Room
{
public:
void roomMethod();
class Node // no ()
{
private:
Node* nextNode;
std::variant<int, float> data;
public:
void someNodeMethod();
}; // missing ;
private:
Node* content;
};