![](/img/trans.png)
[英]declaring a friend function in the global namespace that returns a template class
[英]Declaring a namespace as a friend of a class
我想知道是否有一種方法,我們使用類在特定的命名空間friend
定義所有函數?
特別是,我有一個班級,例如:
class C {
private:
// ...
public:
// ...
friend C* B::f1(C*);
friend C* B::f2(C*);
friend C* B::f3(C*);
friend C* B::f4(C*);
friend C* B::f5(C*);
};
和命名空間B
為:
namespace B {
C* f1(C* x);
C* f2(C* x);
C* f3(C* x);
C* f4(C* x);
C* f5(C* x);
};
現在,我寧願避免在類定義中編寫5行來使命名空間B
所有五個函數與C
類一起使用,並告訴編譯器命名空間B
中定義的所有函數都是C
類的朋友(即可以訪問其私人成員)。
我想快速修復是將命名空間更改為類並將函數定義為靜態成員,然后將類B
聲明為類C
的朋友。 但是,出於好奇,我想知道命名空間是否也可以這樣做?
提前致謝。
不,它不可能是命名空間。 如果沒有別的,它將構成“安全漏洞”,因為命名空間可以擴展到任何地方。 因此,任何人都可以向命名空間添加任意函數並訪問類的非公共數據。
你能得到的最接近的是你提出的解決方案,使這些函數成為一個類的靜態成員並與該類成為朋友。 但話說回來,為什么不首先讓它們成為原始類的靜態成員(代碼中的C
)?
順便說一句,如果我在我的代碼中遇到了這么多朋友函數的需求,它會讓我再次思考我的設計,很難; 我認為這是我做錯事的一個標志。
如果將名稱空間提升為類,則可以同時為多個函數提供幫助。 它帶有(許多)其他缺點,但你可能實際上想要一個B類(出於其他原因)。
class C {
private:
// ...
public:
// ...
friend struct B_domain;
};
struct B_domain {
static C* f1(C* x);
static C* f2(C* x);
static C* f3(C* x);
static C* f4(C* x);
static C* f5(C* x);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.