【问题标题】:Does QScopedPointer hide multiple inheritanceQScopedPointer 是否隐藏多重继承
【发布时间】: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() 函数的原因)。此外,我试图访问的私有类的部分是公开的!

标签: c++ qt


【解决方案1】:

好吧,这原来是由于某些白痴(我)对不同库中的两个不同类使用相同的文件名。 测试库为 Ui_CVForm 选择了一个标头,其中不包含像上面的 lineEdit 这样的项目,而 PrivateCV 正在使用另一个...因此没有关于在编译时看不到标头的抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2016-01-01
    相关资源
    最近更新 更多