[英]PIMPL const correctness
。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'需要讓clas'myclass'的客戶端使用dll-interface
等等,什么? 我不希望任何人使用它,但內部的myclass ...安全忽略? 我試着尋找答案,但沒有一個案例接近我在這里的情況。 在其他情況下,它似乎確實有點問題。
您可以隱藏訪問者函數后面的d
,並基於const
重載。 而不是直接訪問d
,然后編寫impl()->count = 2;
。 impl()
將返回Private *
,而impl() const
將返回const Private *
。
。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()
{
...
}
不是將整個類標記為導出,而是僅通過dll標記要使用的函數。
class myclass
{
public:
DLLEXPORTMACROTHING myclass();
DLLEXPORTMACROTHING ~myclass();
DLLEXPORTMACROTHING void myfunction();
...
private:
struct Private;
PrivatePtr<Private> d;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.