Векторы не инициализируются должным образом при вызове перегруженной функции назначения - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть класс "SecretMessages", который использует перегрузку операторов с копированием и назначением. Он имеет 3 элемента данных, наиболее важно вектор сообщений и вектор message_views, который соответствует количеству оставшихся просмотров каждого сообщения. У меня проблема, когда оператор присваивания вызывается, векторы не инициализируются должным образом. Таким образом, даже если я в состоянии прочитать все копируемые данные внутри функции, когда она вызывается для значения L, эти значения не обновляют вектор.

Мое определение класса выглядит так:

class SelfDestructingMessage {
     public:
         vector<string> messages;
         long number_of_allowed_views;
         vector<long> message_views; // keeps track of each message view 
         ... 
         SelfDestructingMessage(SelfDestructingMessage &sdm); // copy 
         SelfDestructingMessage operator = (SelfDestructingMessage &sdm); // assign };

А вот выходные данные из тестового файла, который я запускал, который создает новый объект SecretMessage и назначает его тому, который был определенный ранее.

sdm4:       //message_views print is empty before assignment
ASSIGNMENT OP
printing out message_views after assign:
0
2
1
END ASSIGNMENT
sdm4 after message views after assignment: 
0
0
0

Я не уверен, почему вектор message_views sdm4 не обновляется после * этого возвращения, даже если значения 0, 1 и 2 находятся в векторе сообщений в функции присваивания. Есть идеи?

1 Ответ

1 голос
/ 22 апреля 2020

Похоже, что возвращение из вашего назначения копирует объект, поэтому ваш оператор return вызывает ваш конструктор копирования. Вы не отправили нам это, но если он очищает свой аргумент, он очищает * это.

Попробуйте изменить тип возврата оператора присваивания на SelfDestructingMessage &, чтобы не вызывать копию.

...