Код операции:
if (shippingOption == OVERNIGHT) {
OvernightPackage packageObject( // Parameters entered here //);
}
else if (shippingOption == TWODAY) {
TwoDayPackage packageObject( // Parameters entered here //);
}
// Presumably, process the package here.
Вы можете сделать это следующим образом, используя автоматическое распределение , что является абсолютно лучшим - самым простым, самым безопасным, самым эффективным - когда этоприменимо:
void process( Package const& package )
{
// Process the package here.
}
void foo()
{
// ... whatever, then:
switch( shippingOption )
{
case overnight:
process( OvernightPackage( blah ) );
break;
case twoDay:
process( TwoDayPackage( blah ) );
break;
default:
assert( false ); // Should never get here.
}
}
Если это невозможно, вы можете использовать динамическое размещение объекта пакета.Проблема в том, что, как новичок, вы, вероятно, недостаточно знаете, чтобы оценить, практически ли вышесказанное практически невозможно (хотя может быть легко увидеть, когда это действительно возможно).В любом случае, для динамического выделения используйте умный указатель , такой как C ++ 11 std::shared_ptr
:
typedef std::shared_ptr<Package> PackagePtr;
PackagePtr foo( blah, blah, arguments )
{
// ... whatever, then:
switch( shippingOption )
{
case overnight:
return PackagePtr( new OvernightPackage( blah ) );
case twoDay:
return PackagePtr( new TwoDayPackage( blah ) );
default:
assert( false ); // Should never get here.
}
}
Когда вы получаете больше опыта, вы должны стремиться всегда использовать для наиболее ограниченныхимеется интеллектуальный указатель, который может выполнять работу, например, std::unique_ptr
.Потому что легко передать владение общему интеллектуальному указателю, но трудно вернуть его обратно в указатель владения.Однако, как новичок, вы обнаружите, что std::shared_ptr
прекрасно работает для большинства вещей, которые в этом отношении похожи на картофель.; -)