Следующее не удается, так как объект, который я хочу назначить скопированный тогда разрушенный. Так я должен объявить 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).
Что бы я сделал, это иметь 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
каким-то образом.
Других решений пока нет …