当前位置:  开发笔记 > 编程语言 > 正文

如何在C++中伪造"类的可见性"(而不是函数)?

如何解决《如何在C++中伪造"类的可见性"(而不是函数)?》经验,为你挑选了1个好方法。

有没有功能,控制能见度C级的/无障碍++.

有没有办法伪造它?
是否有任何可以模拟最接近行为的C++宏/模板/魔术?

情况就是这样

Util.h (图书馆)

class Util{   
    //note: by design, this Util is useful only for B and C
    //Other classes should not even see "Util"
    public: static void calculate(); //implementation in Util.cpp
};

Bh (图书馆)

#include "Util.h"
class B{ /* ... complex thing */  };

Ch (图书馆)

#include "Util.h"
class C{ /* ... complex thing */  };

Dh (用户)

#include "B.h"    //<--- Purpose of #include is to access "B", but not "Util"
class D{ 
    public: static void a(){
        Util::calculate();   //<--- should compile error     
        //When ctrl+space, I should not see "Util" as a choice.
    }
};

我的解决方案不好

让所有成员Util都是私人的,然后声明: -

friend class B;
friend class C;

(编辑:感谢ASH "此处不需要前瞻声明".)

坏处 :-

这是一种修改,Util以某种方式识别BC.
在我看来这没有意义.

现在B和C可以访问每个成员Util,打破任何private访问控制.
有一种方法可以只为一些成员启用朋友,但它不是那么可爱,并且对于这种情况无法使用.

D只是不能使用Util,但仍然可以看到它.
Util在使用自动完成(例如ctrl+space)时仍然是一个选择D.h.

(编辑)注:编码方便; 防止一些错误或错误的使用/更好的自动完成/更好的封装.这不是反黑客攻击,也不是防止未经授权访问该功能.

(编辑,接受):

可悲的是,我只能接受一种解决方案,因此我主观地选择了需要较少工作并提供很大灵活性的解决方案.

对于未来的读者来说,Preet Kukreti(和评论中的texasbruce)和Shmuel H.(以及ASH评论)也提供了值得一读的好解决方案.



1> Shmuel H...:

我认为最好的办法就是不要Util.h在公共标题中加入.

为此,#include "Util.h"仅在实现cpp文件中:

Lib.cpp:

#include "Util.h"

void A::publicFunction() 
{
    Util::calculate();
}

通过这样做,您可以确保更改Util.h只会在库文件中产生影响,而不会在库的用户中产生影响.

这种方法的问题是无法Util在您的公共标头(A.h,B.h)中使用.前向声明可能是此问题的部分解决方案:

// Forward declare Util:
class Util;

class A {
private:
    // OK;
    Util *mUtil;

    // ill-formed: Util is an incomplete type
    Util mUtil;
}


另请注意,在此解决方案中,Util.h标头不需要与用户的库一起重新分发,因此您作为库作者可以确保您想要的任何有限用途,并且您的库的用户永远不会知道关于它.
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有