C++ 在接受私有类型参数的公共类上声明私有方法

C++ 在接受私有类型参数的公共类上声明私有方法,c++,class,C++,Class,我正在用C++-17编写一个套接字库,它有一个公共类socket(即,我在.hpp文件中声明它)。这个类应该是用户和库之间的接口 我有一个私有类型(在.cpp文件中声明)数据包,用于表示内存中的数据包。类型Socket有一些私有助手方法,它们将Packet作为参数 如果我试图只在.cpp文件中声明helper方法,编译器会抱怨不存在这样的成员。如果我试图在.hpp中声明该方法,则无法命名参数类型,因为它应该是私有的 这是公共类声明(在.hpp中): 类套接字{ 私人: //…私人属性 //voi

我正在用C++-17编写一个套接字库,它有一个公共类
socket
(即,我在
.hpp
文件中声明它)。这个类应该是用户和库之间的接口

我有一个私有类型(在
.cpp
文件中声明)
数据包
,用于表示内存中的数据包。类型
Socket
有一些私有助手方法,它们将
Packet
作为参数

如果我试图只在
.cpp
文件中声明helper方法,编译器会抱怨不存在这样的成员。如果我试图在
.hpp
中声明该方法,则无法命名参数类型,因为它应该是私有的

这是公共类声明(在
.hpp
中):

类套接字{
私人:
//…私人属性
//void serialize(Packet p,uint8_t buffer[64]);//这是helper函数。`Packet`是私有类型
公众:
//…构造器之类的
}
以下是我试图在实现文件中定义函数的方式:

void套接字::序列化(数据包p,uint8\t缓冲区[64]){
//…很多事情
}

我应该如何在不公开库内部构件的情况下声明这些函数。

您可以将
数据包
制作成嵌套的私有套接字类,这意味着它不会向库的用户公开

类套接字{
私人:
类包{
...
};
公众:
...
};

您是指公共访问说明符意义上的“公共”还是公共头文件中可见的库内部(不应以这种方式公开)意义上的“公共”?我想让其他人可以访问类套接字,而不让他们访问数据包。我认为在标题中声明内容可以让其他人访问它们?因为它们只包含头文件,而不包含实现文件。那么我能在我的库的其余部分使用Packet类吗?或者它只能在Socket类内部访问?它通常只对Socket类可用。如果您希望在整个库中使用它,最好的办法可能是在库包含文件夹之外创建一个头文件,这意味着库的用户仍然无法访问它,但在库中您可以自由访问它。但是要声明套接字类的helper函数,我需要访问该报头中的数据包类型,对吗?在这种情况下,我会把它包括进去,然后它就会公开。是的,事实上是这样。我想一个解决方案是创建一个派生类
socketternal
,其中隐藏了与数据包相关的所有功能,您将始终使用内部类并实例化套接字,但只返回父类。当然,这将禁止您公开套接字的构造函数,但就我个人而言,我并没有看到多少不同的解决方案。