gpt4 book ai didi

c++ - 类命名空间?

转载 作者:太空宇宙 更新时间:2023-11-04 14:45:19 25 4
gpt4 key购买 nike

是我的问题还是 C++ 中面向对象范式的实现缺少类命名空间的概念?

这是我的意思的一个例子:

Document { Header {} Body {} Footer {} }

文档是一个可以有页眉、正文和页脚的对象。

从外部命名空间处理此类对象及其元素的直接方法是

  • 文档
  • 文档::标题
  • 文档::正文
  • 文档::页脚

有没有办法在C++中实现这样的命名结构而不对Document类的定义施加限制?

1) 命名空间文档{ ... }

这种情况需要在它自己的命名空间内有一个对象类,并且使用 Document::Document 似乎是多余的和意外的。

2) namespace Document { class ... } typedef Document::Document 文档;

这种情况给出了 document 和 Document::{part},这在区分大小写的语言中可能看起来很奇怪且无关。

3) 类文件{类...};

这种情况需要在每个嵌套类的定义中包含文档 header ,并且不允许使最终对象成为其部分的派生对象,因为它们是在其自己的范围内定义的。

4) 类文档{类...};类文档:公共(public)文档{}

这种情况接近预期,但需要额外的类和继承。

!) 理想情况下,我想要的是

namespace class Document {

class Header;
class Body;
class Footer;

class Document; // linked with the parent namespace as with its own name space

}

Document doc; // ok, resolves Document as a class
Document::{Part} docPart; // ok, resolves Document as namespace

.) 是否有任何其他合理的方式来实现预期目标而不需要不合理的额外成本?

我也不太清楚为什么这种微不足道的事情不是标准的做法。 :/有什么具体原因吗?

--- 澄清 ---

为了解决一些提出的问题,

“它有什么用?” 1) 普通语言 2) 从语言结构到对象抽象模型的透明映射,反之亦然。

“为什么要从物体的各个部分派(dispatch)生出一个物体?”并非对象引入的每个实体都必须是它的一部分。例如,它可以是它的本质。例如:

Document { Skeleton{} Parts { Header {} Body {} Footer {} } }

---抽象框架---

将对象视为一个模块,其定义可以使用外部符号并引入一些自身的符号以及其自身的逻辑实体的定义,自引入它们以来它们应该保持相关。

---点---

整个模块就是一个对象的定义。如果能够在没有任何额外的语言 mock 的情况下使用它,那就太好了。

===分辨率===

感谢您的反馈。

在 C++ 中有一种方法可以将命名空间名称链接到类之前,我想我会使用

ObjectName { ... Object {} } -> ObjectName::Object, ObjectName::Part

在这种情况下构建。它可能没有我想要的那么短,但至少足够透明,无需额外费用,并且可以与前向声明一起使用。

最佳答案

您的第三个选项 - 使用嵌套类声明/定义,将为您提供理想的范围解析(尽管它不会涉及单个命名空间)。

class Document 
{
public:
class Header
{
// Header class declaration here
};

class Body
{
// Body class declaration here
};

class Footer
{
// Footer class declaration here
};

// Document declaration here.
};

您对该选项的担忧是:

要求在每个嵌套类的定义中包含文档 header

是的——嵌套类与周围类密不可分,它们的实现将取决于周围类的定义,因为它包含嵌套类的定义。这是不可避免的。

Dpes 不允许使最终对象成为其部分的派生物,因为它们是在其自己的范围内定义的。

您正在尝试做的事情似乎没有什么逻辑意义 - 您正在尝试根据其自身的部分来定义某物,这是一个循环定义。您试图通过从页眉、正文或页脚派生文档来实现什么目的?

你问题的最后一行表明你发现你想要的功能“微不足道”,但根据我的观点和经验,它远非微不足道。由于语法相似,您似乎将命名空间和类混为一谈,但它们是完全不同的概念。您必须在脑海中将两者分开,除了一些作用域效果和作用域解析语法之外,它们几乎没有重叠。您的“文档”必须是命名空间和类。选择一个 ;)(从技术上讲,实际上可以同时拥有 namespace 文档和类文档,但这可能会造成混淆。)

关于c++ - 类命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12579855/

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