Создание мелкой копии внутри оператора присваивания - PullRequest
0 голосов
/ 06 февраля 2012

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

class C
{
    public:
    C &operator=(const C &rhs)
    {
        if (&rhs == this)
            return *this;
        memcpy(this, &rhs, sizeof(C));
        Init(rhs);
        return *this;
    }

    .........
};

Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Нет. Если объект не имеет типа POD, это неопределенное поведение. А также пользовательский оператор присваивания означает, что это не POD. И в На практике это может потерпеть неудачу по ряду причин.

Одним из возможных решений является определение вложенного типа POD с данными членов, и просто назначьте его, например ::100100

class C
{
    struct Data { /* ... */ };
    Data myData;
public:
    C& operator=( C const& other )
    {
        myData = other.myData;
        return *this;
    }
};

Конечно, это означает, что вам нужно постоянно ссылаться на каждого участника как myData.x, а не просто x.

1 голос
/ 06 февраля 2012

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

0 голосов
/ 06 февраля 2012

Вы пытаетесь разыменовать ссылку C ++, используя оператор *.Если у вас не определен оператор * для этого класса, он не будет работать.

Я имею в виду в строке

memcpy(this, *rhs, sizeof(C));
...