【问题标题】:Structure definition inside a Class类中的结构定义
【发布时间】:2020-11-27 14:13:36
【问题描述】:

我一直试图理解这一点,并试图找到一些关于类中结构类型定义的信息(对于 C++)。但是,对于我的实际疑问,我还没有找到任何好的解释。 如果我们有以下定义

namespace MyOuterNamespace {
  namespace MyInnerNamespace {
    class MyClass {
      struct MyStruct {
        int myVar;
      };
      MyStruct m_MyStruct;
    };
  }
}

在此示例代码中,m_MyStruct 是私有成员,因此无法从外部访问。但是结构定义是可访问的,我们可以在任何地方声明这种类型的结构变量

MyOuterNamespace::MyInnterNamespace::MyClass::MyStruct outsideStruct;

使这成为可能的主要因素是什么。如果结构被定义为类的私有部分中的类型,为什么可以从外部使用它?这是否仅用作结构定义的“命名空间”。它实际上并没有作为结构变量隐藏。

我发现了几篇文章,但也许​​来自类似线程的这个答案实际上是在回答并给出语言如何理解这一点的原则:Nested structures

谁能证实这一点或提供更好的解释?

[编辑] 您可以对公共定义执行此操作,但对于私有定义,您将面临预期的可见性错误。

谢谢!

【问题讨论】:

  • 不,您不能访问类的内部类型。尝试编译上述outsideStruct 的声明会给出“错误:'MyStruct' 是 'MyOuterNamespace::MyInnterNamespace::MyClass' 的私有成员”。
  • “但是结构定义是可访问的,我们可以声明这种类型的结构变量” - 不,你不能!你编译过这个吗?如果是,如何?证明:coliru.stacked-crooked.com/a/accea178513b7692
  • 我发现编译这个的唯一编译器是 Intels ICC(同时抱怨警告)——gcc、llvm 和 msvc 都(正确地)拒绝并显示错误消息:godbolt.org/z/3qWhcx
  • 感谢您的回复。是的,毕竟这不是编译。结构定义在公共部分中,毕竟不是私有的。无论如何,我将把这个问题留在这里以供参考。谢谢大家!

标签: c++ class namespaces structure


【解决方案1】:

私人意味着私人。不多,不多。请注意,C++ 不是面向对象的语言,它只支持使用类。因此,事实上,可以使用具有字段大小和声明顺序信息的原始指针来切断封装。在这里使用双冒号进行命名空间是一种便利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多