Say I have a class A with only a constructor:
struct A
{
A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
I also have a class B which contains an instance of A and defines the copy constructor as follows:
struct B
{
B() = default;
B(const B& other) : _a{} {}
A _a;
};
The constructor of B here simply initializes _a with a new instance of A. But, how could I write the assignment operator for B (since I can't "reinitialize" _a)?
CodePudding user response:
If you want operator= to create a fresh new A similar to the copy constructor and if dynamic allocation is feasible you can use a std::unique_ptr<A> as member:
struct A
{
A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
struct B
{
B() : _a{std::make_unique<A>()} {}
B(const B& other) : _a{std::make_unique<A>()} {}
B& operator=(const B& other) {
_a = std::make_unique<A>();
return *this;
}
std::unique_ptr<A> _a;
};
Though, if B has a non-copyable (non-movable) member, then the least surprise would be if B is also non-copyable (non-moveable).
CodePudding user response:
According to the definition of class A, an instance of A is non-copyable and also non-moveable. Therefore, I accepted the answer of @463035818_is_not_a_number.
Here is another answer which assumes that A can be made moveable, just for completeness or in case it may be useful to somebody.
struct A
{
A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
A(A&&) = default;
A& operator=(A&&) = default;
};
struct B
{
B() = default;
B(const B&) : _a{} {}
B& operator=(B other)
{
std::swap(_a, other._a);
return *this;
}
A _a;
};
