QScopedPointer是否隐藏多重继承

时间:2017-03-31 15:49:01

标签: c++ qt

我无法访问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");    
}

任何指针(双关语)都是最受欢迎的!

1 个答案:

答案 0 :(得分:0)

好的,原来是因为一些白痴(我)在不同的库中使用相同的文件名用于两个不同的类。 测试库正在为Ui_CVForm挑选一个标题,它不包含上面的lineEdit项,而PrivateCV正在使用另一个...因此没有关于在编译时没有看到标题的抱怨。