如何访问类中的私有数据成员的方法/函数

问题描述:

请查看代码示例。如何访问类中的私有数据成员的方法/函数

  1. A.DLL将使用B.DLL B类
  2. b为A类

现在私人构件,有一个模块C(C.dll或C.exe) ,C可以访问模块A但不能访问模块B.但是我们希望C可以调用B的方法,我如何调整我们的设计以接近?

  • 我们不能修改B.DLL,因为它是一个第三方模块

  • 我们可以做一些改变A类,我们不希望暴露在A 2层的方法来调用乙方法直接诸如(这不是一个好的设计,我想)

    A::B_methods1() { b->B_methods1() }

    A::B_methods2() { b->B_methods2() }

  • ,我们也不想暴露私有数据部件B直接如

    const B* A::getB() { return b; }

任何想法?多谢。

添加一些评论:

这是非常复杂的(或者需要一些特殊参数)打造B. 的实例,如果C要访问/调用我们只能用建立一个B.如此, B的功能,C具有通过A.使用

Module A.dll 

class A 
{ 
public: 
    A(); 
    virtual ~A(); 

private: 
    B* b; 

} 

Module B.dll 

#ifdef SDK_DLL 
#define HLAPI __declspec(dllexport) 
#else 
#define HLAPI __declspec(dllimport) 
#endif 

class HLAPI B 
{ 
public: 
    B(); 
    virtual ~B(); 

public: 
    B_method1(); 
    B_method2(); 
} 
+0

你能澄清吗?你想在B之外调用* private * B成员函数? –

+0

@NikosC。是。一个新的模块C,C想要访问B函数。但是C不能访问模块B,并且只能访问模块A. – Orionpax

+0

然后我想在B_method1()之前的'public:'说明符是一个错字,而你打算写'private:',对吧? –

我认为当你调用A类直接调用它的私有成员B的方法的方法,这是不坏的设计,原因是b只是提供了一种服务和A使用它,但隐藏使用情况。这也会发生在您使用图书馆提供的邮件功能 - 这是正常的。

不过,我会建议引入adapter或第三方模块B上facade - 这样下去它更换,可以让你有基于B更多的抽象和让你还引入了其他一些方法。 使用来自“无处不在”的直接调用将第三方模块绑定到代码时需要小心 - API更改,这可能会导致大量维护工作。但是请记住,不应该封装所有内容 - 特别是不包含具有数千个函数的API。

我知道这些决定并不容易,因为它们最终可能会导致大量工作(或时间/金钱的损失),所以请保持下巴;-) Btw。如果你还没有,我可以真正推荐“设计模式”(Gamma等人),“企业模式”(Fowler)和“Effective C++”(Meyers)这两本书。

*约斯特

让我们考虑(因为问题的约束并不可行,)由语言

  1. 暴露出B成员提供的可能性,
  2. 使得C A的一个朋友(我假设这是不可行的任一,并且我知道这是hugly)
  3. 使B A的受保护的部件和私人从A
  4. 导出c。提供访问功能,或OTH呃意味着获得A在B上执行所需的操作(复合访问函数,通过外观/适配器抽象)。

我会去的1的混合和4我将A的乙构件隔离成具有门面/适配器接口的“代理”对象,然后暴露暴露乙本身的该对象来代替。

,如果你给我们一些细节上的A,B和C

希望的语义已经有一定帮助所有这一切都将是bettere适合您的需求。