gpt4 book ai didi

c++ - 如何访问类的私有(private)数据成员中的方法/函数

转载 作者:行者123 更新时间:2023-11-28 07:31:11 25 4
gpt4 key购买 nike

请查看代码示例。

  1. A.dll 将使用 B.dll 中的类 B
  2. b是A类的私有(private)成员

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

  • 我们不能修改 B.dll,因为它是第 3 方模块

  • 我们可以对类 A 做一些更改,我们不想在 A 中公开 2 个方法来直接调用 B 方法(我认为这不是一个好的设计)

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

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

  • 而且我们也不想直接暴露私有(private)数据成员b,比如

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

有什么想法吗?非常感谢。

添加一些评论:

构建B的实例非常复杂(或需要一些特殊参数)。我们只能使用A来构建B。因此,如果C想要访问/调用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 的方法时直接调用它的私有(private)成员 B 的方法,这不是一个糟糕的设计,因为 B 只是提供一种服务而 A 使用它,但隐藏了用法。当您使用提供例如的图书馆时,也会发生这种情况。邮件功能 - 正常。

但是,我建议引入一个 adapterfacade在第 3 方模块 B 上——这使它保持可交换,允许您对 B 有更多的抽象,并让您也引入一些额外的方法。使用来自“任何地方”的直接调用将 3rd 方模块绑定(bind)到您的代码时要小心 - API 会发生变化,这可能会导致大量维护工作。但也请记住,您不应该封装所有内容——尤其是具有数千个函数的 API。

我知道做出这些决定并不容易,因为它们最终会导致大量工作(或损失时间/金钱),所以请保持警惕 ;-)顺便提一句。如果您还没有它们,我真的可以推荐书籍“设计模式”(Gamma 等人)、“企业模式”(Fowler)和“Effective C++”(Meyers)。

*约斯特

关于c++ - 如何访问类的私有(private)数据成员中的方法/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17669818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com