考虑以下课程:
class SessionConnection
{
...
private:
SessionHandle sessionHandle;
RemoteSessionHandle remoteSessionHandle;
};
它的ctor是这样的:
SessionConnection::SessionConnection(whatever) :
..., sessionHandle{some_more_whatever}, remoteSessionHandle{sessionHandle}, ...
{
...
}
RemoteSessionHandle
看起来像这样:
class RemoteSessionHandle
{
...
private:
SessionHandle* sessionHandle;
};
RemoteSessionHandle::RemoteSessionHandle(SessionHandle const& pSessionHandle) :
..., sessionHandle{&pSessionHandle}
{
...
}
注意:这些课程有更多成员,但我想坚持这一点。
构建后,SessionConnection
会将sessionHandle
注入remoteSessionHandle
,movedFromSessionConnection movedToSessionConnection
+------------------------------+ +----------------------------+
| movedFromSessionHandle | | movedToSessionHandle |
| ^ | | ^ |
| | | | | |
| movedFromRemoteSessionHandle | | movedToRemoteSessionHandle |
+------------------------------+ +----------------------------+
会保留指向它的指针。
然而,我对移动构造函数有疑问。在搬家之前,我有这个:
movedFromSessionConnection --- mv ---> movedToSessionConnection
+------------------------------+ +----------------------------+
| movedFromSessionHandle ---- mv ----> movedToSessionHandle |
| ^ -----------------------------------+ |
| | |
| movedFromRemoteSessionHandle - mv -> movedToRemoteSessionHandle |
+------------------------------+ +----------------------------+
每个RemoteSessionHandle都指向其SessionHandle。搬家后,我明白了:
movedFromRemoteSessionHandle
movedToRemoteSessionHandle
的内容已移至movedFromSessionHandle
,因此现在指向movedToSessionHandle
。移至LIBSSH2_SESSION*
后,处于未知状态。
我考虑过以下解决方案:
在这种情况下,选项2和3是可能的,因为这些类是通过设计强耦合的。但是,我已经考虑过,如果不是这样,我该怎么做。
我看了整个网络,我发现没有其他人遇到这个问题,所以我的第一直觉就是相信我忽略了一些非常明显的东西(或者我缺少这个特定搜索的google-fu)
我是否忽视了任何明显的事情?这是一个无问题的问题,可以通过我可能忽视的任何问题轻松解决吗?
修改
根据伊戈尔的评论,我决定增加一些背景。我正在使用这些类来使用boost.asio创建一个libssh2会话。 libssh2会话的创建经历了几个状态,并且设置和关闭足够对称,我可以使用RAII来管理它(我详细说明了here)。
RemoteSessionHandle需要SessionHandle,因为后者拥有前者运行所需的{{1}},因此依赖。