2011-10-20 54 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,因爲這會使您的界面更容易正確使用,並且難以正確使用。