2013-10-08 20 views
0

我在將工作pimpl類轉換爲單身人士時遇到了一些麻煩。這裏是起點代碼:將單身人士功能添加到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); 
              ^

然後我tryed移動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); 
      ^

你對此任務有任何建議?非常感謝

回答

1

首先是因爲您正嘗試使用另一個類的私人構造函數ApiRequestPrivate創建ApiRequest。據推測,構造者想要私下支持你認爲你想要的任何基於單身的瘋狂;所以一種解決方案是讓ApiRequestPrivate成爲ApiRequest的朋友。

或者,您可以在ApiRequest::getApiRequest中創建對象。把這個功能的實現移到私有類中是毫無意義的。

第二是因爲該函數是靜態的,所以沒有對象來訪問成員。但是,你打電話的功能也是靜態的,所以你不需要反正對象:

return ApiRequestPrivate::getApiRequest(value); 

但是,再次,真的沒有一點引入額外的功能。

我也想知道如果你想傳遞一個值給函數來創建請求,然後在下一次傳遞一個不同的值,會發生什麼。如果這需要改變,那麼單身可能比通常情況更糟糕。

+0

在'ApiRequest :: getApiRequest()'中創建對象工作正常。謝謝。 – bullet