2011-10-20 57 views
0

它是由,如果声明一个类功能的程序员提到的堆栈溢出,例如:C++操作者技术

operator++() 

即用于用户界面的目的(如用户自然地呈现其相对应工作) ,你应该声明另一个:

operator--() 

是否有链接到支持此文章的文章?我希望能够将其引用给其他程序员。

我想补充一点,也许这个建议与rule of 3the big 2类似。

根据hostilefork的回答,或许在即使它没有达到目的但是作为私有的情况下也应该声明相反的功能,所以用户明确知道他们不能调用该功能?还是仅仅是迂腐?

+3

当你在谈论比较运算符(< > ==等)时,这对我来说肯定是有意义的,以便任何比较都可以工作。但对于++和 - ,你可能有理由只实现其中的一个。 – crashmstr

+0

确实。我曾经遇到过需要添加单一功能的情况。只是想看看是否有更多的细节参考,因为这是一个有效的设计建议。 – SSight3

回答

2

一个很难的事情有关C++和运算符重载是,它可以是某种双关语的。重载分配创建了一个位,且auto_ptr咸菜的,因为试图采取“转让”是理所当然的是感到吃惊通过分配A到B,然后后来马上发现一个码!= B.

http://hostilefork.com/2009/07/10/smart-pointer-casting-study/

我将指出,如果下面的通用代码可以编译,一类的用户往往会认为它不会断言:

SomeType foo (...); 
SomeType bar (foo); 
foo++; // let's say we know this is safe 
foo--; // then we'd generally hope this is safe also 
assert(foo == bar); // ...and this is true 

有没有执法,虽然。有些人直言不讳它是坏的要容忍这样的语义免费为所有:

http://yosefk.com/c++fqa/operator.html

我向他说,以保持其中的一些期望是非常重要的倾斜。但是,如果不编译一个程序,那么递减不应该有意义。向前迭代器被提到,完美的例子。

你用语言获得的基础性事物往往是非常“数学”和“对称的”(就像一个整数不可能有加法但不是减法)。但我认为正在针对特定问题量身定制的课程趋向于从不对称获得更大价值。

这是一种普遍性vs特异性的东西。考虑一个靠近用户的应用程序。他们不希望所有的东西都是平等的,更常见的操作应该是“容易的”,而偶尔的操作可能会被边缘化。一些最令人沮丧的软件是不关注常见情况的软件。那些解决问题的专门课程往往不如通用语言结构或图书馆对称。

+0

优秀的答案深度。你的评论'//然后我们一般会希望这是安全的'也强调了这样一个事实,即可能相反的运营商应该声明**,但**(并且一个大但在那里)是私人的,所以如果用户试图打电话它,他们明确知道即使说++,它也不是一个有效的命令。 – SSight3

+0

很高兴你喜欢它,我希望有更多机会在StackOverflow上进行哲学蜡染。 :)至于宣布私事vs.没有声明,我一般认为这对于禁用默认设置(如默认拷贝构造函数)很有用......对于++/case,你有什么不同? – HostileFork

+0

我认为哲学讨论对于扩展知识是有用的。我在考虑更多的是禁用++/- ,但是,++/- 在默认情况下是禁用的 - 所以也许要告诉用户你知道这个函数,但是它被有意地禁用了? – SSight3

2

我不认为如果你声明一个运营商(说operator ++()),那么你必须申报另一个(operator --())。它总是在需要的基础上。如果你需要operator --()然后申报。

用户自然地承担其应对面工作

有些情况下,这种说法是不正确的。例如,你的程序正在每隔一小时通过并做一些事情。这里只有operator ++()可以适用。 operator --()甚至不可能。

2

为什么?甚至连标准的前向迭代器都没有:-)

+0

为什么?如给出的,如果用户认为他们可以使用++,他们应该有 - 。同样,如果你有+ =你应该有 - =(我注意到这个词应该)。该建议在应该支持它的类的上下文中是有意义的。我很好奇为什么有一个单向迭代器?我将添加上面提供的建议是对我设计的特定类设计的反驳,所以看到对非对称设计的支持很有趣。 – SSight3

+1

@ SSight3:例如'istream_iterator'是单向的,因为你不一定倒回输入流。特别是它是一个InputIterator,甚至不是ForwardIterator。 –

+1

@ SSight3:有单向迭代器,因为有容器(或类似容器的对象)不能反向迭代。像单链表和一些类型的流。 –

4

我会说这个建议是不准确的。

反例是一个前向迭代器。例如,单链表上的迭代器不能倒退,所以operator - ()将不起作用。

7

这在很大程度上取决于类的语义。例如,前向迭代器将始终定义运算符++,但不会运算符。

如果它使多大意义,因为它确实减小数字递增的东西,那么我同意与原来的说法,但也有一定的情况下,其中一个有意义,其他没有。

1

为运营商提供时,你可以得到的最重要的建议是,编程是关于建模,你应该做的无论是在你的自然。如果在您的域中,该类型建模的对象可以同时递增和递减,那么如果在中只有一个操作存在,那么您的设计应支持这两种操作,然后在设计会混淆您的用户。

编程不是关于在编译器中抛出代码,以便它可以执行,而是解决特定问题。考虑手头的问题,并以最自然的方式从那里开展工作。并且整体遵循Principle of least astonishment,因为这会使您的界面更容易正确使用,并且难以正确使用。