У меня нет источника для того, чтобы это было наилучшей практикой, но в целом, если вы собираетесь каким-либо образом хранить ресурс, я считаю, что лучше всего приобретать этот ресурс таким же образом.
Причина этого заключается в том, что в C ++ 0x копирование / перемещение выполняется при задании аргумента, затем вы просто перемещаете его в хранилище, например:
struct store_string
{
store_string(std::string s) : // potentially free, copy if not
s(std::move(s)) // free
{}
std::string s;
};
Или в C ++ 03, если ваш тип может быть дешево создан по умолчанию:
struct store_string
{
store_string(std::string ss) // make necessary copy
{
s.swap(ss); // free
}
std::string s;
};
Так что для вас я бы сделал:
class Case2
{
boost::scoped_ptr<A> a_ //polymorphic data member owned by C
public:
Case2(boost::scoped_ptr<A>& aa)
{
a.swap(aa); // take resource
}
};
Это упростит вам задачу и позволит клиенту точно знать, как будет осуществляться управление ресурсом.