Назначить объект по ссылке, без копирования

Следующее не удается, так как объект, который я хочу назначить скопированный тогда разрушенный. Так я должен объявить B::data в качестве указателя вместо этого, или есть какой-то лучший причудливый способ назначения по ссылке, а не путем копирования (я хочу избежать вызова dtor)?

class B {
class myContainer{
myContainer()  {/* allocate memory */}
~myContainer() {/* free memory */}
...
};
myContainer data;
};

...
void foo() {
B x;
x.data = myContainer(...);  // creates a myContainer, *copies* to x.data, then destroys
}

В идеале я не хочу использовать new так как я хочу разместить myContainer в стеке (и, следовательно, не нужно вручную управлять памятью, что является целью автоматического освобождения в dtor).

1

Решение

Что бы я сделал, это иметь data быть ссылкой на myContainer, Так:

class B
{
public:
class myContainer
{
...
};
myContainer& data;
B(myContainer& d) : data(d) {}
};

void foo()
{
B::myContainer a;
B x(a);
}

Примечание: вам понадобится myContainer длиться как минимум до тех пор, пока B в этом случае, так что есть хороший аргумент, чтобы НЕ делать что-либо в этом случае, если вы можете предвидеть, что кто-то делает это:

B* bar()
{
B::myContainer a;
B *p = new B(a);
return p;
}

Теперь, когда bar заканчивается, a разрушается. Но есть еще ссылка на это в *p, так что все будет очень странно, когда мы попытаемся использовать p->data каким-то образом.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru