移动语义和指针成员(依赖)

时间:2013-07-13 19:00:27

标签: c++ c++11 move-semantics

考虑以下课程:

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注入remoteSessionHandlemovedFromSessionConnection movedToSessionConnection +------------------------------+ +----------------------------+ | movedFromSessionHandle | | movedToSessionHandle | | ^ | | ^ | | | | | | | | movedFromRemoteSessionHandle | | movedToRemoteSessionHandle | +------------------------------+ +----------------------------+ 会保留指向它的指针。

然而,我对移动构造函数有疑问。在搬家之前,我有这个:

movedFromSessionConnection --- mv ---> movedToSessionConnection
+------------------------------+     +----------------------------+
| movedFromSessionHandle ---- mv ----> movedToSessionHandle       |
|            ^ -----------------------------------+               |
|                                                 |               |
| movedFromRemoteSessionHandle - mv -> movedToRemoteSessionHandle |
+------------------------------+     +----------------------------+

每个RemoteSessionHandle都指向其SessionHandle。搬家后,我明白了:

movedFromRemoteSessionHandle

movedToRemoteSessionHandle的内容已移至movedFromSessionHandle,因此现在指向movedToSessionHandle。移至LIBSSH2_SESSION*后,处于未知状态。

我考虑过以下解决方案:

  1. 从RemoteSessionHandle的移动ctor中排除指针。我发现这有点“臭”,因为我还没有找到一个移动ctor的例子,它不会移动 - 或采取行动 - 所有数据成员。
  2. 从SessionConnection中删除SessionHandle,并使其成为 相反,RemoteSessionHandle。
  3. 在RemoteSessionHandle中实现“常规”移动ctor(“常规” 意思是移动所有数据成员),并让SessionConnection移动ctor 重置RemoteSessionHandle中的指针。
  4. 在这种情况下,选项2和3是可能的,因为这些类是通过设计强耦合的。但是,我已经考虑过,如果不是这样,我该怎么做。

    我看了整个网络,我发现没有其他人遇到这个问题,所以我的第一直觉就是相信我忽略了一些非常明显的东西(或者我缺少这个特定搜索的google-fu)

    我是否忽视了任何明显的事情?这是一个无问题的问题,可以通过我可能忽视的任何问题轻松解决吗?

    修改

    根据伊戈尔的评论,我决定增加一些背景。我正在使用这些类来使用boost.asio创建一个libssh2会话。 libssh2会话的创建经历了几个状态,并且设置和关闭足够对称,我可以使用RAII来管理它(我详细说明了here)。

    RemoteSessionHandle需要SessionHandle,因为后者拥有前者运行所需的{{1}},因此依赖。

0 个答案:

没有答案