【问题标题】:Is it possible to have restricted access to included class?是否可以限制访问包含的课程?
【发布时间】:2021-10-29 08:56:37
【问题描述】:

我在 A.h 文件中有一个类 A,在 B.h 文件中有一个类 B: public A

A.h 文件

#ifndef A_H
#define A_H

class A
{
  public:
    void foo {}
};

#endif

B.h 文件

#ifndef B_H
#define B_H
#include "A.h"

class B: public A
{
  ...
};

#endif 

有没有办法包含 B 但在我包含 A.h 之前无法访问 A

这样

#include "B.h"

main() {
  B* b = new B(); //OK
  b->foo();       //OK
  A* a = new A(); //Error
  a->foo();       //Error  
}

【问题讨论】:

  • 正确不,看起来像 XY 问题,为什么需要它?
  • 我想你也许可以用 C++20 模块做到这一点。尽管有人说B 公开继承自A,但这强烈暗示任何知道B 是什么的人都应该知道A 是什么。
  • @Someprogrammerdude 看起来您误读了这个问题。 OP 希望这是一个错误,直到或除非 A.h 直接包含在 main 中
  • 根据您到底想做什么,也许将A 拆分为一个接口和一个实现?那么B派生自A_interface,但是A_impl是完全独立的?
  • 再一次,这很可能是 XY 问题,描述你想要实现的目标,会有更好的解决方案。

标签: c++ inheritance


【解决方案1】:

没有。 Bh 依赖于 A 的定义,因此如果不包含 A 的定义,就无法包含 Bh。如果 B 必须在 Bh 中定义并且 B 必须继承 A,则无法绕过这种依赖关系。

您可以通过将A 更改为抽象类型来使创建单独的A 成为错误。但即使 A.h 单独包含在内,这仍然是一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多