4

。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 以外的任何人使用...可以安全地忽略吗?我试图寻找答案,但没有一个案例与我在这里的情况相近。在其他情况下,它确实似乎有点问题。

4

3 回答 3

7

您可以隐藏d在访问器函数后面,并基于const. 然后,您无需直接访问,而是d编写impl()->count = 2;. impl()会返回Private *,而impl() const会返回const Private *

于 2013-11-04T12:19:19.007 回答
2

。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()
{
    ...
}
于 2014-03-04T11:24:47.147 回答
0

不要将整个类标记为导出,只需标记您打算通过 dll 使用的函数。

class myclass
{
public:
    DLLEXPORTMACROTHING myclass();
    DLLEXPORTMACROTHING ~myclass();

    DLLEXPORTMACROTHING void myfunction();
...
private:
    struct Private;
    PrivatePtr<Private> d;
};
于 2017-01-10T13:43:18.513 回答