【发布时间】:2017-04-03 16:58:00
【问题描述】:
我无法访问 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");
}
欢迎任何指针(双关语)!
【问题讨论】:
-
您是否将 ui 表单的标题拉到您尝试访问其内容的位置?
-
要访问私有成员,您可以 A) 将测试类/函数设为
friend。 B) 使用 g++ 的-fno-access-control选项(我一般不推荐它,但它可以对测试有用)。 -
呃,我想它可能像标题一样简单。我想如果它看不到 ui 标头,我会遇到编译问题(doffeeent Ines!)。我稍后再试。
-
我正在访问的类是私有实现的朋友,并且已经是公共实现的朋友,(这就是我可以访问 d() 函数的原因)。此外,我试图访问的私有类的部分是公开的!