Добавить одноэлементную функцию в класс Pimpl

0

У меня возникли проблемы с преобразованием рабочего класса 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 );
            ^

У вас есть советы по этой задаче? Большое спасибо

Теги:
singleton
pimpl-idiom

1 ответ

1
Лучший ответ

Во-первых, вы пытаетесь создать ApiRequest используя частный конструктор из другого класса ApiRequestPrivate. Предположительно, конструктор хочет быть частным, чтобы поддерживать любое безумство, основанное на одном синглете, которое вы считаете нужным; поэтому одно решение - сделать ApiRequestPrivate другом ApiRequest.

Кроме того, вы можете создать объект в ApiRequest::getApiRequest. Нет смысла перемещать реализацию этой функции в частный класс.

Второе - потому, что функция статична, поэтому нет доступа к объектам. Однако функция, которую вы вызываете, также статична, поэтому вам не нужен объект в любом случае:

return ApiRequestPrivate::getApiRequest(value);

Но, опять же, нет смысла вводить эту дополнительную функцию.

Мне также интересно, что должно произойти, если вы хотите передать одно значение функции для создания запроса, а затем передать другое значение в следующий раз. Если это нужно изменить, то синглтон, вероятно, еще хуже, чем обычно.

  • 0
    Создание объекта в ApiRequest::getApiRequest() работало нормально. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню