C ++: вопрос о конструкторах копирования - PullRequest
2 голосов
/ 07 августа 2010

У меня есть класс, где я использую this для инициализации void* указателя.Но проблема в том, что когда я передаю экземпляр этого класса по значению , указатель не изменится на новый адрес в стеке.Итак, я подумал переопределить конструктор копирования, чтобы переназначить указатель с новым адресом this.Но мне нужны переменные для вызова конструктора суперкласса, который я обычно получаю по параметрам конструктора, но у меня их нет в конструкторе копирования ...

Надеюсь, я хорошо объяснил ...

Итак, вопрос в том, могу ли я сохранить процедуру конструктора копирования по умолчанию, куда я добавлю часть переназначения указателя?Или есть лучшие альтернативы?

Спасибо

Вот код:

class GetsCopiedByValue : public SuperClass
{
    GetsCopiedByValue(Type1 *t1, Type2 *t2, float var1, /* A lot of other things I need */) :
         SuperClass(t1, t2), var1(var1)
    {
         t1->set_GetsCopiedByValue_Address(this);  // ***
    }
}

Где-то еще:

{
    GetsCopiedByValue instance (t1, t2, 4.64, /* All the other things */);
    SomeType *t = new SomeType(instance); // <-- here, it gets copied by value,
}  // but the original "instance" goes (here) out of scope and the address 
   // I assigned (***) is not longer valid, so I have to
   // reassign the address to the new address, after copying it.

Ответы [ 2 ]

2 голосов
/ 07 августа 2010

Не уверен, поможет ли это, но вы можете фактически вызвать конструктор копирования суперкласса в конструкторе копирования:

GetsCopiedByValue(GetsCopiedByValue const& other) :
     SuperClass(other), var1(other.var1)
{
     t1->set_GetsCopiedByValue_Address(this);
}

Но я думаю, что даже если вы опустите этот базовый классвызов конструктора, C ++ вставит его для вас.

0 голосов
/ 07 августа 2010

Вам нужно будет сохранить параметры при первом создании объекта (возможно, в суперклассе, поскольку это то, что их использует), а затем снова использовать их при построении копирования, т.е. считывать их обратно из объекта, с которого вы копируете.

Редактировать

Более того, сделайте, как @Konrad Rudoplh предлагает , а также определите и используйте конструктор копирования для базового класса.

...