我无法访问PIMPL设计的私有部分。 "当然!",你说!你应该是的! 好吧,我正在写一些功能测试,所以我不在乎我访问私人会员,好吗? : - )
为了达到目的,我将公共类设置为私有实现的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的常量有关吗? 当我在CV内部时,我可以毫无问题地访问PrivateCV的ui表单元素。
void CV::and_another_thing()
{
d()->lineEdit->setText("wtfa");
}
任何指针(双关语)都是最受欢迎的!
答案 0 :(得分:0)
好的,原来是因为一些白痴(我)在不同的库中使用相同的文件名用于两个不同的类。 测试库正在为Ui_CVForm挑选一个标题,它不包含上面的lineEdit项,而PrivateCV正在使用另一个...因此没有关于在编译时没有看到标题的抱怨。