У меня возникли проблемы с преобразованием рабочего класса pimpl в singleton. Вот стартовый код:
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() обратно в общедоступный, а компиляция завершилась неудачей с помощью следующего кода:
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 );
^
У вас есть советы по этой задаче? Большое спасибо
Во-первых, вы пытаетесь создать ApiRequest
используя частный конструктор из другого класса ApiRequestPrivate
. Предположительно, конструктор хочет быть частным, чтобы поддерживать любое безумство, основанное на одном синглете, которое вы считаете нужным; поэтому одно решение - сделать ApiRequestPrivate
другом ApiRequest
.
Кроме того, вы можете создать объект в ApiRequest::getApiRequest
. Нет смысла перемещать реализацию этой функции в частный класс.
Второе - потому, что функция статична, поэтому нет доступа к объектам. Однако функция, которую вы вызываете, также статична, поэтому вам не нужен объект в любом случае:
return ApiRequestPrivate::getApiRequest(value);
Но, опять же, нет смысла вводить эту дополнительную функцию.
Мне также интересно, что должно произойти, если вы хотите передать одно значение функции для создания запроса, а затем передать другое значение в следующий раз. Если это нужно изменить, то синглтон, вероятно, еще хуже, чем обычно.
ApiRequest::getApiRequest()
работало нормально. Благодарю.