2017-05-29 63 views
8

如何限制僅在特定類中的類的實例化?如何確保一個特定的類只能創建另一個類的實例?

我不想限制它在一個文件中,所以匿名命名空間不適合我。

請注意,我想讓限制類的聲明對整個世界都是可見的,只是全世界只有一個特定的候選者只能實例化它。

我該如何做到這一點?

+4

將該孤立類作爲「朋友」與非公共構造類的「私人」構造函數結合使用應該有效。 –

+0

「我想讓被限制類的聲明對整個世界都是可見的,只有一個來自整個世界的特定候選人只能實例化並訪問它」然後,爲什麼要顯示它,如果你不能碰它?我錯過了什麼嗎? – ZDF

+0

你想要一個Singleton模式嗎?實例化它一次,並使用一個實例的一切? – dage5

回答

5

你可以採用passkey pattern(從Rakete1111的例子借款):

class pass_key { friend class allowed_t; pass_key() {} }; 

struct restricted_t 
{ 
    restricted_t(pass_key); 
}; 

class allowed_t 
{ 
public: 
    allowed_t() : yes(pass_key()) {} // ok, allowed_t is a friend of pass_key 

private: 
    restricted_t yes; 
}; 

class not_allowed_t 
{ 
public: 
    not_allowed_t() : no(pass_key()) {} // not ok, pass_key() is private 

private: 
    restricted_t no; 
}; 

int main() 
{ 
    allowed_t a;  // OK, can access constructor 
    not_allowed_t b; // ERROR, only a friend of the key 
        // class has access to the restricted 
        // constructor 
} 

該模式允許更細粒度的訪問控制不是讓restricted_tallowed_t的朋友,避免了複雜的代理模式。

+0

這是一個不錯的解決方案。非常感謝 :)。 – Mariners

+0

@Mariners不客氣。也請看[Matthieu的描述](https:// stackoverflow。com/a/3218920/3235496)的實施細節模式。 – manlio

11

使用friend s!製作班級Foo班級的朋友Bar意味着Foo可以訪問Bar的私人成員。如果您將構造函數設爲私有,則只有Foo將能夠創建Bar的實例。

struct restricted_t { 
    friend struct allowed_t; // allow 'allowed_t' to access my private members 
private: 
    // nobody can construct me (except for my friends of course) 
    restricted_t() = default; 
}; 

struct allowed_t { 
    restricted_t yes; // ok 
}; 

struct not_allowed_t { 
    restricted_t no; // not ok 
}; 

int main() { 
    allowed_t a; // ok, can access constructor 
    not_allowed_t b; // error, constructor is private 
} 
相關問題