public:
void doStuff() const;
private:
struct Private;
Private * d;
통화 당
struct XX::Private
{
int count;
}
void XX::doStuff() const
{
d->count = 2; // I want an error here!!
}
당신은 furher 설명이 필요합니까?
업데이트 : 내가 코드에 덜 변경해야 조금 다른 뭔가를 할 거라고 생각
.
.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;
};
통화 당
난이 만든#include <PrivatePtr.cpp>
struct myclass::Private()
{
...
}
그러나 이것은 "C4251 원인 MyClass의 :: D : 클래스 'PrivatePtr은'DLL 인터페이스는 CLA를 'MyClass에'
대기, 어떤 클라이언트가 사용되어야 할 필요가 있겠습니까? 내부적으로 myclass가 아닌 다른 누구에게도 사용되는 것을 원하지는 않습니다 ... 무시해도 안전합니까? 나는 대답을 찾고자했지만 어떤 경우도 내가 여기있는 것에 가깝지 않았다. 다른 경우에는 상당히 문제가있는 것으로 보입니다.
나는 당신의 문제에 대한 설명을 매우 좋아합니다. –
상수 포인터는 상수에 대한 포인터와 다릅니다. transitive constence를 적용하려면 자체 래퍼를 작성해야합니다. –