2017-03-31 57 views
0

我無法訪問PIMPL設計的私有部分。 「當然!」,你說!你應該是! 那麼,我正在寫一些功能測試,所以我不在乎我正在訪問私人成員,好嗎? :-)QScopedPointer是否隱藏多重繼承

爲了說明問題,我將公共類與QScopedPointer一起設置爲私有實現,如下所示;

class CV { 
... 
private: 
    QScopedPointer<PrivateCV> const _d_ptr; 
    PrivateChartView * d(); 
    const PrivateChartView *d() const; 
}; 
PrivateCV * CV::d() 
{ 
    return _d_ptr.data(); 
} 

const PrivateCV* CV::d() const 
{ 
    return _d_ptr.data(); 
} 

和私營位看起來是這樣的:

class PrivateCV : public QObject, public Ui_CVForm 
{ 
    Q_OBJECT 
    friend class MyTestClass; 
public: 
    ... 
public slots:  
    void do_something(); 
} 

似乎MyTestClass可以訪問PrivateCV的do_something()成員函數,它獲得如下(僞代碼,obvs):

CV *cv = MyApp::get_a_cv(); 
PrivateCV *pcv = cv->d(); 

也就是說,它會調用這個罰款:

pcv->do_something(); 

但我無法訪問Ui_CVForm(從uic生成的UI類)上的任何內容。 Ui_CVForm是(部分)如下:

class Ui_CVForm 
{ 
public: 
    QGridLayout *gridLayout_2; 
    QGroupBox *groupBox; 
    QLineEdit *lineEdit; 
}; 

這是什麼做的函數d(的常量性),或QScopedPointer吧? 當我在裏面的簡歷,我也沒有任何問題訪問PrivateCV的UI表單元素..

void CV::and_another_thing() 
{ 
    d()->lineEdit->setText("wtfa");  
} 

任何指針(雙關語意)最歡迎!

+1

你有沒有把ui表格的頭部拉到你試圖訪問它的東西的地方? – Zeks

+0

要訪問私人會員,您可以:A)使測試班/功能成爲「朋友」。 B)使用g ++的'-fno-access-control'選項(不是我一般推薦它,但它可以*用於測試)。 –

+0

我想這可能和標題一樣簡單。如果它看不到ui頭部,我想我會遇到編譯問題(doffeeent Ines!)。我會稍後再試。 – mike

回答

0

好吧,原來是由於一些白癡(我)使用相同的文件名爲兩個不同的類在不同的庫。 測試庫爲Ui_CVForm提取了一個頭文件,其中不包含像上面的lineEdit這樣的項目,而PrivateCV正在使用另一個...因此沒有抱怨在編譯時沒有看到頭文件。