После прочтения RAII, просмотра презентации Херба Саттера на CppCon2014 и прочтения основных рекомендаций и связанных статей в течениеВ некоторые дни я все еще запутался в владении и связанной с ним семантике.
Допустим, класс A и класс B представляют физические объекты, и есть класс Scene и класс Process.Класс Process является функцией main
, если хотите.В реальном мире A может приобрести B и физически сохранить его для себя.Это может также выпустить это.Поэтому в течение экземпляра Process объект A должен иметь возможность иметь для себя экземпляр B, а также освобождать его после того, как с ним покончено.Как и B живут в сцене, которой должен управлять процесс.
Также выводится B: A использует некоторый интерфейс, в то время как сцена использует другой интерфейс, предоставляемый B.
Давайте попробуемс некоторым кодом, по крайней мере, для Процесса:
class Process
{
public:
void run();
};
void Process::run()
{
auto scn = Scene {};
auto a = A {};
auto b = B {};
scn.add(a); // stores a
scn.add(b); // stores b
a.acquire(b); // stores b, and represents physical possession of a B
a.doSomething();
a.release(b); // sets a's B instance to null, and physically loses the B
}
Поправьте меня здесь, если я ошибаюсь, это сомнительная часть.
Из того, что я понимаю, А должен (а не каккод) находиться в куче и указывать на shared_ptr, поскольку у Process и Scene есть свой экземпляр A. То же самое будет и для B, который хранится как в a
, так и в scn
, икоторый находится в процессе .Почему бы тогда scn
не быть make_unique
d?
Другой способ сделать это - поместить все в стек (как в фрагменте кода).Оба решения кажутся мне идентичными, я вообще не понимаю смысловой разницы этих двух вариантов, но я бы предпочел первый.