2012-08-16 61 views
0

中的成员访问包装类的成员例如,我: “wrapper.h”如何从包含在类

class wrapper : public QWidget 
{ 
    Q_OBJECT 
    public: 
    Wrapped_class m_class; 

    private: 
    QTimer* m_timer; 
} 

“Wrapped_class.h”

class Wrapped_class 
{ 
public: 
Wrapped_class(); 
public slots: 
f(); // slot which is called when m_timer send signal timeout() 

} 

“Wrapped_class.cpp”

Wrapped_class::Wrapped_class() 
{ 
QOBject::connect(wrapper::m_timer, SIGNAL(timeout()), this, SLOT(f())) 
} 

我得到错误的包装:: m_timer在不可访问

回答

1

您需要一个pointerreference才能访问它的non static成员。传递一个pointer对包装类,当它被包裹

添加这样的事情你Wrapped_class

void Wrapped_class::setWrapper(wrapper *w) 
{ 
    m_wrapper = w; 
} 

,并调用此函数的对象被包装时。初始化m_rappernullptr在构造函数中

+0

我做m_timer静态的,但仍然得到错误,这是不可访问 – 2012-08-16 09:05:20

+0

@spin_eight:因为它标志着'private'。你确定你想要一个'静态'定时器吗?这意味着只有一个定时器适用于所有的包装 – Andrew 2012-08-16 09:05:56

+0

是的,这正是我想要的。是的,它被标记为私有的,但包装的私有成员可以被包装的其他成员访问*,对吗? – 2012-08-16 09:08:55

0

m_timer不是一个静态成员,所以你不能这样访问它。在Wrapped_class.cpp你需要包装类的实例与wrapper::m_timer不是静态的使用它

0

除了问题,它也是私人这意味着Wrapped_class不能访问它。您需要将Wrapped_class作为wrapper的朋友才能访问私人会员。

+0

可能的话,最好添加一个'getter'而不是制作一个'friend' – Andrew 2012-08-16 09:03:30

1

根据你的意图和你的系统的设计,你可以选择:

  1. 传递一个指针或“包装”类的引用来“包装”类。是洁具,您必须将包装类定义为friend才能访问private成员。
  2. 编写“包装器”类的成员函数来处理两个类之间的交互。 (这并不真正符合你的限制,但它是一个设计方案。)