0

作業中の 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 );
            ^

このタスクに関するヒントはありますか? どうもありがとう

4

1 に答える 1