Вы можете просто возвратить такой объект копией, если у вас нет веских причин избегать такой схемы:
Foo make_foo()
{
int n = get_mystery_value()
Foo x(n);
x.manipulate();
return x;
}
Если вы предпочитаете обрабатывать объект указателем, используйте std::shared_ptr<Foo>
вместо:
std::shared_ptr<Foo> make_foo()
{
int n = roll_dice();
auto px = std::make_shared<Foo>(n);
px->crazy_stuff();
return px;
};
Или, если вам нужен только один объект-обработчик, используйте std::unique_ptr<Foo>
.
Небольшое объяснение: наличие постоянного члена в вашем объекте по существу означает, что сам объект имеет семантику постоянного объекта. Можно копировать константы, но не переназначать их, так что в вашем типичном случае вы можете создать объект этого класса только один раз, а не переназначить его. Конструктор копирования определяется для вас автоматически, поэтому вы можете пойти дальше и сказать:
int main()
{
Foo x = make_foo();
Foo y(make_foo()); // same thing
x.twiddle();
y.skedaddle();
// ...
}
Очевидно, что вы не можете и не скажете x = make_foo();
, потому что ваш x
является семантически постоянной вещью, для которой переназначение не имеет смысла.