2012-11-08 214 views
1

我有多個類需要共享另一個類的單個實例。公開地說,這個班級的存在應該是未知的。是否適合做類似以下的事情? (測試書面)類間共享變量C++

#include <iostream> 

class hideme 
{ 
    private: 
     int a; 

    public: 
     void set(int b) { a = b; } 
     void add(int b) { a += b; } 
     int get() { return a; } 

     hideme() : a(0) { } 
}; 


class HiddenWrapper 
{ 
    protected: 
     static hideme A; 

}; 

hideme HiddenWrapper::A; 

class addOne : public HiddenWrapper 
{ 
    public: 
     void add() { A.add(1); } 
     int get() { return A.get(); } 
}; 

class addTwo : public HiddenWrapper 
{ 
    public: 
     void add() { A.add(2); } 
     int get() { return A.get(); } 
}; 


int main() 
{ 
    addOne a; 
    addTwo b; 

    std::cout << "Initialized: " << a.get() << std::endl; 

    a.add(); 
    std::cout << "Added one: " << a.get() << std::endl; 

    b.add(); 
    std::cout << "Added two: " << b.get() << std::endl; 

    return 0; 
} 

對於它的價值,hideme是我試圖圍繞設計一個門面庫的一部分,而其他類都從與靜態hideme互動庫成員。

此外,如果爲HiddenWrapper編寫的頭文件沒有對應的源文件,那麼定義其靜態成員的最佳位置是?有一名包括後衛。

有沒有其他方法可以解決這個問題?據我所能想象的(不是很遠),我只能用友誼來解決它,但我很謹慎。

+1

當使用它的最後一個對象被銷燬時,該單個對象是否應該被銷燬?有私人成員和朋友的單身人士是否足夠? – pmr

+0

我的規則總是公共繼承是IS A關係。當一個類需要成爲另一個類的更具體的實例時,可以使用它。你可以使用私有繼承,這會使它更好一點。另一種選擇是讓每個人都保留一個引用或共享指針。 – Jarryd

+0

我已經在多個地方閱讀,以避免朋友,所以我一直在做。儘管如此,這是可能的。我現在正在研究組合,看起來它涉及共享引用或指針。謝謝 – user1758039

回答

0

您可以通過不允許在使用它的翻譯單元之外訪問類來阻止對類的訪問。

// public_header.h 

class A { 
    void bar(); 
}; 
class B { 
    void foo(); 
} 

// private_implementation.cpp 
#include "public_header.h" 

namespace { 
    class hidden { void baz() {} }; 

    hidden h; 
} 

void A::bar() { 
    h.baz(); 
} 
void B::foo() { 
    h.baz(); 
} 

該類僅適用於A :: bar和B :: foo。類型hidden和變量h在技術上仍然具有外部鏈接,但沒有其他翻譯單位可以說出他們的名字。

+0

有趣的方法,如BeachWalker和Billz所提到的那樣,有什麼情況可能更喜歡這種方式,而不是在構造函數中注入隱藏對象的引用? – user1758039

+0

@ user1758039好吧,這確實使用了一個通常應該避免的全局變量。但通過構造函數傳遞共享對象需要該類型在外部可見。這取決於你爲什麼試圖隱藏事物。當然,繼承也意味着這個類是公開可見的...... – bames53

0

有時,通過構造函數(也稱爲組合而不是繼承)注入共享資源(通過引用或指針)是一個更好的主意。通過這種方式,您可以共享或不共享(例如,爲您的代碼提供線程安全的變體)。更多信息請參見http://de.wikipedia.org/wiki/Inversion_of_Control原理。

+0

謝謝,現在看看! – user1758039

0

這實現了周圍的一些其他類獨立的,並從 用戶隱藏它:

class hideme {}; 

// fwd declarations 
class x; 

// library internal 
class S 
{ 
    S() = delete; 
    S(S const&) = delete; 
    void operator=(S const&) = delete; 
private: 
    static hideme& getInstance() 
    { 
    static hideme instance; 
    return instance; 
    } 

    friend x; 
}; 

// library classes 
class x { 
    hideme& s; 
public: 
    x() : s(S::getInstance()) {} 
}; 

int main() 
{ 
    x x; 
    return 0; 
} 

這不處理,你真正想要的時候沒有其他對象不再使用它要銷燬的hideme 一審案件。對於 ,您需要使用參考 計數來獲得更多創造性。

我也應該說我認爲這是一個壞主意。單身人士差不多都是 。

+0

爲什麼單身人士通常是個壞主意?我目前不打算將它作爲一個整體來使用,但學習總是很好。 – user1758039

+0

@ user1758039單例類似於全局變量,但在某些方面更糟糕。實際上你很少需要一種不可能實例化的類型,而不是僅僅需要其中一種的類型。如果你只想要一個單一的實例,那麼只需要一個實例,不要去限制進入課堂。 – bames53