2016-07-15 7 views
0

私はいくつかの静的メソッドとインスタンスメソッドを持つシングルトンを持っています。私はそれを別の場所で使用できるようにDLLでエクスポートしたいと思います。しかし、私はクラスのプライベートデータメンバをエクスポートしていなかったのでコンパイラの警告が生成されました。シングルトンとauto_ptrでのPIMPLの使用

私の研究では、私はPIMPLイディオムを見つけ、それが私がやりたいことをするために使用できることを見ました。 「Singletons are evil/anti-patterns」の議論を控えてください。私の場合、すべてのサブオブジェクトに対してマネージャクラスが必要なので意味があります。簡潔にするために、私はクラスの他のメソッドのいくつかを減らすつもりですが、私は一般的なアイデアのために十分に残します。

HIDDeviceImpl CPPファイル内の空 HIDDeviceデストラクタのためのアイデアはアリÇehreliによって this articleから来

HIDDevice.hpp

class HIDDeviceImpl; // Forward Declaration 

class HIDDevice 
{ 
public: 

    static HIDDevice* getDevice(unsigned short vendorID, unsigned short productID); 

    int writeData(const unsigned char *data, int length); 


    int readData(unsigned char *data, int length); 

    ~HIDDevice(); // Note public destructor declared in HIDDevice.hpp 

private: 

    std::unique_ptr<HIDDeviceImpl> m_pImpl; // pointer to the implemetation 
}; 

HIDDevice.cpp

#include "HIDDeviceImpl.hpp" 
#include "HIDDevice.hpp" 

HIDDevice* HIDDevice::getDevice(unsigned short vendorID, unsigned short productID) 
{ 
    return HIDDeviceImpl::getDevice(vendorID, productID); 
} 

int HIDDevice::writeData(const unsigned char *data, int length) 
{ 
    return m_pImpl->writeData(data, length); 
} 


int HIDDevice::readData(unsigned char *data, int length) 
{ 
    return m_pImpl->readData(data, length); 
} 

HIDDeviceImpl.hpp

#include "HIDDevice.hpp" 

class HIDDeviceImpl : public HIDDevice 
{ 
public: 

    static HIDDeviceImpl* getDevice(unsigned short vendorID, unsigned short productID); 

    int writeData(const unsigned char *data, int length); 

    int readData(unsigned char *data, int length); 

private: 
    // some private static and private member functions and data 
    // private constructor and destructor 
}; 

HIDDeviceImpl.hppは

#include "HIDDeviceImpl.hpp" 

/** Non-member Static Data Definitions **/ 
/** internal map used to store all HIDDevice objects */ 
static std::map<std::string, HIDDeviceImpl*> m_hidDevices; 

HIDDeviceImpl* HIDDeviceImpl::getDevice(unsigned short vendorID, unsigned short productID) 
{ 
    //implementation 
} 

int HIDDeviceImpl::writeData(const unsigned char *data, int length) 
{ 
    //implementation 
} 

int HIDDeviceImpl::readData(unsigned char *data, int length) 
{ 
    //implementation 
} 

HIDDeviceImpl::HIDDeviceImpl(unsigned short vendorID, unsigned short productID, std::string serialNumber) 
{ 
    // implementation 
} 

HIDDeviceImpl::~HIDDeviceImpl() 
{ 
    // implementation 
} 

// Note the HIDDevice destructor is declared in the HIDDeviceImpl file. 
HIDDevice::~HIDDevice() 
{ 
    // intentionally left blank 
} 

さて、これが生成するエラーは以下の通りです:これは、HIDDeviceにauto_ptr端を発するさ

error C2248: 'HIDDeviceImpl::~HIDDeviceImpl' : cannot access private member declared in class 'HIDDeviceImpl' 

.hpp

+1

'std :: auto_ptr'はスマートポインタをC++の世界に持ち込む最初の試みではありましたが、欠陥のあるもので、' std :: auto_ptr'はC++ 11以降廃止され、削除されますC++では17。手動のポインタ管理を使用するか、新しい['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)を使用してください。 –

+1

'unique_ptr'とそれに関連するptrsが、壊れた' auto_ptr'を置き換えるために作成されました。記事は2002年のものであることに注意してください。 – SurvivalMachine

+0

PimplイディオムのpImplクラスは、「パブリッククラス」から派生しません。実際には、パブリッククラスはpImplのどこにも表示されません。それ以外の場合は循環参照があります – KABoissonneault

答えて

1

なぜエラーメッセージがあなたに指示していることを行うだけでなく、デストラクタを公開するのはなぜですか?そうすれば、std::unique_ptrの内部にアクセスすることができます。

+0

私はプログラマーエラーによってオブジェクトが早すぎて破壊されるのを望まないので。 – audiFanatic

+0

@audiFanatic 'm_pImpl'はHIDDevice(私的だから)からしかアクセスできないのでプログラマーエラーで早くも破壊されることはありません – KABoissonneault

+0

@KABoissonneault真実なPIMPLを最初に実装しようと思いますあなたの他のコメント)、私はこれを行かせます。 – audiFanatic

関連する問題