几年前,我浏览了刚刚发布的三星 BADA SDK 和相关资料,我被大量的“教程”和“指南”所震惊,这些“教程”和“指南”试图通过构建不良的示例来阐明语言和平台的各个基本方面C++ 语言级别的明显错误(即参见http://mobileawards.ir/LinkClick.aspx?fileticket=zf9YxiDILVg=&tabid=937的第 8 页和第 9 页- 三星发布的演示文稿,代码示例是原始的,我见过SDK中类似的地方)。但它相对较新,所以我认为他们会清理它。
最近对我提出了一些不能仅仅将其视为“错字”或“意外错误的代码示例”的事情:
virtual result Osp::Base::Collection::IList::Add ( const Object & obj ) [pure virtual]
参数:
[in] obj 要添加的对象
备注:
该方法执行浅拷贝。它只添加了指针;不是元素本身。
…………
_虚拟对象* Osp::Base::Collection::IList::GetAt( int index ) [纯虚拟]
对我来说,从“经典 C++”的角度来看,这是一个明显的错误。在很多层面上都是错误的:
它通过引用接受通用事物以存储在列表中。在备注中,有一个注释,它将不是通过复制,不是通过引用,而是通过指针存储。采用 by-ref 而不是指针可能只会迫使实现者执行一些强制转换/*/&s,但这是相对较小的问题
接受的参考是const。项目访问器 GetAt() 实际上返回非常量对象!因此,该系列会自动为您解构一切。
各种指南中有很多警告告诉您不要 Add() 基于堆栈或列表中的临时对象。他们明确地告诉您 Add() 仅基于堆的对象,由
new
..GetAt 实际上返回非常量指针,而不是引用!可能是为了能够返回一个魔术值作为错误(在 BADA 中没有异常处理..)。现在看一些关于列表处理的各种教程,观察所有那些散布在最令人惊讶的地方的 *s 和 &s,例如:
MyObj* x = new MyObj(); list.Add(*x); // the '*' is at least mighly misleading..
这后来导致了一些惊人的问题,比如没有使用指针的三星 bada 开发,这表明这个可怜的人真的很困惑。但我开始跑题了。
以上是其中一个核心接口的片段,稍后将被各种核心集合实现和使用。实际上所有哈希/列表/等都有类似的 hm.. 约定。
对我来说,它看起来好像是由受过 Java 或 C# 培训的人设计的,并且对 C++ 语言知之甚少。Const 经常被滥用,引用也是如此。而且,我看不出有任何理由*)
我在这里的判断错了吗?你知道为什么这些接口是这样设计的任何合理的解释吗?确切地说,我正在寻找以下解释:
- 为什么他们使用'const',而它并不是真正的意思或保留?
- 为什么他们使用引用,而他们在没有使用的评论中说?
(*) 好吧,除了“引用不能为 NULL”的都市神话,这可能表明“添加”不能接受空指针。这仍然是一个疯狂的想法,因为添加元素需要您取消引用Add(*ptr)
,因此很容易注意到引用当然可以是 NULL..
编辑/问题理由:
在迈克的即时和明确的评论之后,我试图尽可能多地删除“咆哮”,这很可能是因为我有时会遇到“纯粹主义者”的情绪。尽管如此,很难在没有听起来像抱怨的情况下提出错误。我不是一个bada开发者。我没有任何真正的理由来咆哮。我的问题不是修辞:我真的很想知道这种设计的原因。我不接受简单的“因为这个/那个开发者是坏的”。这是可能的,我想过,但我拒绝这样的推理,因为我不是无所不知的,因为,嗯,这是完全无法证明的。我问是因为这让我很困扰,我想知道原因。我希望一些经验丰富的 bada 开发人员会出现并指向我一些描述它的文章,我无法搜索到,或者会丢弃一些历史信息,实际上证明这是从 pre-std-C++ 借来的塞班。我不指望快速反应。我实际上认为这个问题会一直没有回应,因为地球上可能没有多少人可以提供这样的信息。然而,这并没有使这个问题成为反问,而且在我看来,这并没有使它成为非问题。当然,每个人都可以有不同的看法。如果是这样,它将被关闭。我实际上认为这个问题会一直没有回应,因为地球上可能没有多少人可以提供这样的信息。然而,这并没有使这个问题成为反问,而且在我看来,这并没有使它成为非问题。当然,每个人都可以有不同的看法。如果是这样,它将被关闭。我实际上认为这个问题会一直没有回应,因为地球上可能没有多少人可以提供这样的信息。然而,这并没有使这个问题成为反问,而且在我看来,这并没有使它成为非问题。当然,每个人都可以有不同的看法。如果是这样,它将被关闭。