如何访问类中的私有数据成员的方法/函数
请查看代码示例。如何访问类中的私有数据成员的方法/函数
- A.DLL将使用B.DLL B类
- 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();
}
我认为当你调用A类直接调用它的私有成员B的方法的方法,这是不坏的设计,原因是b只是提供了一种服务和A使用它,但隐藏使用情况。这也会发生在您使用图书馆提供的邮件功能 - 这是正常的。
不过,我会建议引入adapter或第三方模块B上facade - 这样下去它更换,可以让你有基于B更多的抽象和让你还引入了其他一些方法。 使用来自“无处不在”的直接调用将第三方模块绑定到代码时需要小心 - API更改,这可能会导致大量维护工作。但是请记住,不应该封装所有内容 - 特别是不包含具有数千个函数的API。
我知道这些决定并不容易,因为它们最终可能会导致大量工作(或时间/金钱的损失),所以请保持下巴;-) Btw。如果你还没有,我可以真正推荐“设计模式”(Gamma等人),“企业模式”(Fowler)和“Effective C++”(Meyers)这两本书。
*约斯特
让我们考虑(因为问题的约束并不可行,)由语言
- 暴露出B成员提供的可能性,
- 使得C A的一个朋友(我假设这是不可行的任一,并且我知道这是hugly)
- 使B A的受保护的部件和私人从A
- 导出c。提供访问功能,或OTH呃意味着获得A在B上执行所需的操作(复合访问函数,通过外观/适配器抽象)。
我会去的1的混合和4我将A的乙构件隔离成具有门面/适配器接口的“代理”对象,然后暴露暴露乙本身的该对象来代替。
,如果你给我们一些细节上的A,B和C
希望的语义已经有一定帮助所有这一切都将是bettere适合您的需求。
你能澄清吗?你想在B之外调用* private * B成员函数? –
@NikosC。是。一个新的模块C,C想要访问B函数。但是C不能访问模块B,并且只能访问模块A. – Orionpax
然后我想在B_method1()之前的'public:'说明符是一个错字,而你打算写'private:',对吧? –