作業中の pimpl クラスをシングルトンに変換するのに問題があります。開始コードは次のとおりです。
apirequest.h
class ApiRequestPrivate;
class ApiRequest
{
public:
ApiRequest( int );
~ApiRequest( );
int method1();
private:
ApiRequestPrivate* const d;
};
apirequest_p.h
#include "apirequest.h"
class ApiRequestPrivate
{
public:
ApiRequestPrivate( int );
int method1();
private:
int member1;
};
apirequest.cpp
#include "apirequest.h"
#include "apirequest_p.h"
ApiRequestPrivate::ApiRequestPrivate( int value )
{
member1 = value;
}
int ApiRequestPrivate::method1( )
{
return member1;
}
ApiRequest::ApiRequest( int value ) : d( new ApiRequestPrivate( value ) )
{
}
ApiRequest::~ApiRequest()
{
delete d;
}
int ApiRequest::method1( )
{
return d->method1( );
}
まず、次の変更を行いました。
apirequest.h
class ApiRequest
{
public:
~ApiRequest( );
static ApiRequest * getApiRequest(int);
int method1();
private:
ApiRequestPrivate* const d;
ApiRequest( int );
};
apirequest_p.h
class ApiRequestPrivate
{
public:
...
static ApiRequest * getApiRequest(int);
private:
...
static ApiRequest * m_apiRequest;
};
apirequest.cpp
...
ApiRequest * ApiRequestPrivate::getApiRequest( int value )
{
if(m_apiRequest == 0) {
m_apiRequest = new ApiRequest( value );
}
return m_apiRequest;
}
...
ApiRequest * ApiRequest::getApiRequest( int value )
{
return d->getApiRequest( value );
}
しかし、コンパイルはさまざまなエラーで失敗します。最初のエラーは次のとおりです。
In file included from apirequest.cpp:1:0:
apirequest.h: In static member function ‘static ApiRequest* ApiRequestPrivate::getApiRequest(int)’:
apirequest.h:17:5: error: ‘ApiRequest::ApiRequest(int)’ is private
ApiRequest( int );
^
apirequest.cpp:17:46: error: within this context
m_apiRequest = new ApiRequest( value );
^
次に、ApiRequest() コンストラクターを public に戻そうとしましたが、コンパイルは次のコードで失敗します。
In file included from apirequest.cpp:1:0:
apirequest.h: In static member function ‘static ApiRequest* ApiRequest::getApiRequest(int)’:
apirequest.h:17:30: error: invalid use of member ‘ApiRequest::d’ in static member function
ApiRequestPrivate* const d;
^
apirequest.cpp:39:12: error: from this location
return d->getApiRequest( value );
^
このタスクに関するヒントはありますか? どうもありがとう