私はいくつかの静的メソッドとインスタンスメソッドを持つシングルトンを持っています。私はそれを別の場所で使用できるように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
'std :: auto_ptr'はスマートポインタをC++の世界に持ち込む最初の試みではありましたが、欠陥のあるもので、' std :: auto_ptr'はC++ 11以降廃止され、削除されますC++では17。手動のポインタ管理を使用するか、新しい['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)を使用してください。 –
'unique_ptr'とそれに関連するptrsが、壊れた' auto_ptr'を置き換えるために作成されました。記事は2002年のものであることに注意してください。 – SurvivalMachine
PimplイディオムのpImplクラスは、「パブリッククラス」から派生しません。実際には、パブリッククラスはpImplのどこにも表示されません。それ以外の場合は循環参照があります – KABoissonneault