风格问题总是有点主观。所以在某些方面我有点喜欢回答他们。这是我的2美分...
考虑一下您希望能够创建派生自的对象Asteroid
并将它们添加到您的集合中。如果该add()
方法碰巧调用Asteroid
了可能是(或使用)虚函数的任何函数,那么您就有可能访问尚未完全构造的对象。
我认为,在构造函数中执行类似这样的操作并让用户了解正在发生的事情是令人困惑的。
我宁愿只做一个简单的功能。它甚至不必是课程的一部分......
Asteroid *CreateAsteroid( AsteroidCollection *coll )
{
Asteroid * a = new Asteroid();
coll->add(a);
return a;
}
如果您确实想继续使用构造方法,您至少可以将您的原始代码行放在这个函数中,并用非常清晰的描述来注释它正在发生的事情。
基本上,尽量不要在幕后做有趣的事情。如果这是不可避免的(或在某种程度上是可取的),请尽量不要强迫编码人员理解奇怪之处,无论该编码人员是您还是其他人。
至少在这种情况下,它并不是那么奇怪。情况可能会更糟!=)
举你最后两个例子......
asteroidCollection->createNew();
asteroidCollection->add( new Asteroid() );
如果您知道它始终是一种Asteroid
被创建的类型,并且您不希望您班级的用户担心它,我认为数字 1 很好。如果Asteroid
不能跨集合共享,那么这样做是有意义的。这类似于我建议的功能,但有点使集合类提供了可能不应该的支持代码。
Asteroid
如果您可以存储派生类型,或者如果您想在将小行星添加到集合之前对其进行特殊处理,则数字 2 很有用。它是所有三种方法中最灵活的。