Вау ....
MyObject::MyObject( const MyObject& oCopy)
{
*this = oCopy;//is this deep or shallow?
}
Это ни то, ни другое. Это вызов оператору присваивания.
Поскольку вы еще не закончили строительство объекта, это, вероятно, опрометчиво (хотя и совершенно справедливо). Однако более традиционно определять оператор присваивания в терминах конструктора копирования (см. Copy и swap idium).
const MyObject& MyObject::operator=(const MyObject& oRhs)
{
if( this != oRhs ){
members = oRhs.members;
.....//there is a lot of members
}
return *this;
}
В целом нормально, хотя обычно результат присваивания не является продолжением.
Но если вы делаете это таким образом, вам нужно немного разделить обработку, чтобы сделать ее исключительной. Это должно выглядеть примерно так:
const MyObject& MyObject::operator=(const MyObject& oRhs)
{
if( this == oRhs )
{
return *this;
}
// Stage 1:
// Copy all members of oRhs that can throw during copy into temporaries.
// That way if they do throw you have not destroyed this obbject.
// Stage 2:
// Copy anything that can **not** throw from oRhs into this object
// Use swap on the temporaries to copy them into the object in an exception sage mannor.
// Stage 3:
// Free any resources.
return *this;
}
Конечно, есть более простой способ сделать это, используя copy и swap idum:
MyObject& MyObject::operator=(MyObject oRhs) // use pass by value to get copy
{
this.swap(oRhs);
return *this;
}
void MyObject::swap(MyObject& oRhs) throws()
{
// Call swap on each member.
return *this;
}
Если в деструкторе нечего делать, не объявляйте его (если только он не должен быть виртуальным).
MyObject::~MyObject(){
//there is nothing here
}
Здесь вы объявляете указатель (не объект), поэтому конструктор не вызывается (так как указатели не имеют конструкторов).
const MyObject * mpoOriginal;//this gets initialized in the constructor
Здесь вы вызываете new для создания объекта.
Вы уверены, что хотите это сделать? Динамически размещенный объект должен быть уничтожен; якобы с помощью удаления, но чаще всего в C ++ вы помещаете указатели в умный указатель, чтобы убедиться, что владелец правильно и автоматически уничтожает объект.
int main()
{ //^^^^ Note main() has a lower case m
mpoOriginal = new MyObject();
return DoSomething();
}
Но так как вы, вероятно, не хотите динамический объект. То, что вы хотите, это автоматический объект, который уничтожается, когда он выходит из области видимости. Также вам, вероятно, не следует использовать глобальную переменную (передавайте ее как параметр, иначе ваш код работает с использованием побочных эффектов, связанных с глобальным состоянием).
int main()
{
const MyObject mpoOriginal;
return DoSomething(mpoOriginal);
}
Вам не нужно вызывать new, чтобы сделать копию, просто создайте объект (передавая объект, который вы хотите скопировать).
bool DoSomething(MyObject const& data)
{
MyObject poCopied (data); //the copy
//lots of stuff going on
// No need to delete.
// delete poCopied;//this causes the crash - can't step into using GDB
// When it goes out of scope it is auto destroyed (as it is automatic).
return true;
}