Итак, сначала вызывается конструктор копирования по умолчанию, а затем выполняется глубокое копирование.К сожалению, это не похоже на работу.
Есть ли лучший способ сделать это?Одно ограничение - я не могу использовать общие / умные указатели.
Если я правильно понимаю, ваш вопрос, вы могли бы рассмотреть возможность использования функции инициализации:
class A
{
int i, j;
char* p;
void Copy(int ii, int jj, char* pp); // assign the values to memebers of A
public:
A(int i, int j, char* p);
A(const A& a);
};
A::A(int i, int j, char* p)
{
Copy(i, j, p);
}
A::A(const A& a)
{
Copy(a.i, a.j, a.p);
}
Тем не менее,вам действительно следует рассмотреть возможность использования RAII (есть причина, по которой люди продолжают рекомендовать его :)) для ваших дополнительных ресурсов.
Если я не могу использовать RAII, я все же предпочитаю создавать конструктор копирования и использовать списки инициализаторов для каждогоmember (на самом деле, я предпочитаю делать это даже при использовании RAII):
A::A(int ii, int lj, char* pp)
: i(ii)
, j(jj)
, p( function_that_creates_deep_copy(pp) )
{
}
A::A(const A& a)
: i(a.i)
, j(a.j)
, p( function_that_creates_deep_copy(a.p) )
{
}
Это имеет преимущество "явности" и легко отлаживается (вы можете вмешаться и посмотреть, что он делает для каждой инициализации).