2012-08-16 104 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. 編寫「包裝器」類的成員函數來處理兩個類之間的交互。 (這並不真正符合你的限制,但它是一個設計方案。)