gpt4 book ai didi

c++ - PIMPL 常量正确性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:26 25 4
gpt4 key购买 nike

.h

public:
void doStuff() const;
private:
struct Private;
Private * d;

.cpp

struct XX::Private
{
int count;
}

void XX::doStuff() const
{
d->count = 2; // I want an error here!!
}

需要进一步解释吗?

更新:

我想我会做一些不同的事情,需要对代码进行较少的更改。我做了这个:

.h

template <class TPriv>
class PrivatePtr
{
public:
...
TPriv * const operator->();
TPriv const * const operator->() const;
...
private:
TPriv * m_priv;
};

.cpp

...

template <class TPriv>
TPriv * const PrivatePtr<TPriv>::operator->()
{
return m_priv;
}

template <class TPriv>
TPriv const * const PrivatePtr<TPriv>::operator->() const
{
return m_priv;
}

然后像这样使用它:

.h

#include <PrivatePtr.h>

class DLLEXPORTMACROTHING myclass
{
...
private:
struct Private;
PrivatePtr<Private> d;
};

.cpp

#include <PrivatePtr.cpp>

struct myclass::Private()
{
...
}

但这会导致 C4251“myclass::d : class 'PrivatePtr' 需要有 dll 接口(interface)才能被 clas 'myclass' 的客户端使用

等等,什么?我不想让除 myclass 以外的任何人在内部使用它……可以安全地忽略它吗?我试着寻找答案,但没有一个案例与我这里的情况相近。在其他情况下,它确实看起来有点问题。

最佳答案

您可以将 d 隐藏在访问器函数后面,并根据 const 重载它。不是直接访问 d,而是编写 impl()->count = 2;impl() 将返回 Private *,而 impl() const 将返回 const Private *

关于c++ - PIMPL 常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19767549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com