2017-03-31 53 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正在使用另一个...因此没有抱怨在编译时没有看到头文件。