簡體   English   中英

PIMPL const正確性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM