簡體   English   中英

將名稱空間聲明為類的朋友

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM