風格問題總是有點主觀。所以在某些方面我有點像回答他們。這是我的2美分...
只要考慮一下,你想能夠創建從Asteroid
派生的對象,並將它們添加到您的收藏。如果add()
方法恰巧調用Asteroid
上可能是(或使用)虛函數的任何函數,那麼您可以打開自己以訪問尚未完全構建的對象的可能性。
我認爲,在構造函數中執行一些像這樣的操作讓用戶理解發生了什麼是令人困惑的。
我寧願只做一個簡單的功能。它甚至沒有成爲一個類的一部分...
Asteroid *CreateAsteroid(AsteroidCollection *coll)
{
Asteroid * a = new Asteroid();
coll->add(a);
return a;
}
如果你確實想留在你的構造方法,你至少可以把你原來的代碼行此功能,並評論其一個非常明確的描述正在發生的事情。
基本上,儘量不要在幕後做有趣的事情。如果這是不可避免的(或者在某種程度上可取的話),儘量不要強迫編碼人員理解這種古怪,無論這個編碼器是你還是其他人。
至少在這種情況下,它不是真的那奇怪。事情可能會更糟! =)
只是爲了把你的最後兩個例子......
asteroidCollection->createNew();
asteroidCollection->add(new Asteroid());
我認爲1號是好的,如果你知道它總是一個類型Asteroid
正在創建,並且你不希望你的班級的用戶擔心它。如果Asteroid
無法在集合中共享,則執行此操作是有意義的。這與我所建議的功能類似,但是這種集合類可能會提供支持代碼,而這些代碼可能不應該。
如果您可以存儲派生的Asteroid
類型,或者在將小行星添加到集合之前想對小行星做特別的事情,則2號碼非常有用。這是所有三種方法中最靈活的。
馬上,如果需要動態分配,那'new'應該至少是一個智能指針。 – chris
嗯,我有意避免外部內存管理系統 - 這不是問題 - 它是關於編碼風格,而不是管理內存。有一個鬆散的'新'沒有被抓到壞風格的回報?就是那個問題。 – bobobobo
'新的小行星(asteroidCollection);'泄漏記憶;爲什麼這可以接受? – ildjarn