我有以下情况:

namespace MyFramework {
  class A {
    void some_function_I_want_B_to_use() {}
  };
  class B {
    B() {
      some_function_I_want_B_to_use() {}
    }
  };
}

我希望 some_function_I_want_B_to_useMyFramework 命名空间之外不可见,但我确实希望它对 MyFramework 内的任何人可见(或者,仅对 B 类可见也可以)。我有很多这样的方法,是将它们从 MyFramework 的公共(public) API 中隐藏以使 MyFramework 中的所有类成为 friend 的唯一方法吗?我还考虑将所有“低级”类放在 B 中,但我不想走这条路,直到我确定它可以实现从 B 内部访问 A 的所有方法的能力,但不能从在 MyFramework 之外。

重申一下,我有一个框架,它全部在一个命名空间中创建,每个类都有对使用该框架的公众有用的方法。但是,每个类也有一些使公共(public) API 复杂化但框架正常运行所必需的方法。

最佳答案

Pimpl idiom ,通常称为 编译防火墙 ,正是您要寻找的。整个 Qt 都是使用这个习语实现的。

// A.hpp
namespace MyFramework {
  class A {
  private:
    class Private;

    Private* implementation;
  };
}

// A_Private.hpp
#include "A.hpp"

namespace MyFramework {
  class A::Private {
  public:
    void some_function_I_want_B_to_use() {}
  };
}

// A.cpp
#include "A_Private.hpp"

namespace MyFramework {
A::A() {
  implementation->some_function_I_want_B_to_use();
}
}

// B.hpp
#include "A.hpp"

namespace MyFramework {
  class B {
    B();

    A a;
  };
}

// B.cpp
#include "A_Private.hpp"

namespace MyFramework {
B::B() {
  a.implementation->some_function_I_want_B_to_use();
}
}

注意 :当然 A_Private.hpp 不会进入你框架最终发行版的 include 目录,即它仍然是 包私有(private) 根据你的需要。

这个例子非常基础。当然,它可以做得更先进和更健壮。此外, Pimpl 还有许多其他优点。有关所有这些信息,请参阅:
  • GotW #100: Compilation Firewalls (Difficulty: 6/10)
  • GotW #101: Compilation Firewalls, Part 2 (Difficulty: 8/10)
  • Pimp My Pimpl — Reloaded
  • Pimp My Pimpl
  • Dpointer
  • 关于c++ - 命名空间级访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15511959/

    10-15 00:33