рекурсивный вызов в конструкторе копирования - PullRequest
0 голосов
/ 10 октября 2018

Я реализовал класс, следуя правилу трех, и получаю сбой.После отладки я пришел к выводу, что конструктор копирования вызывает сам себя несколько раз вместо вызова оператора равенства.Почему это так?Разве это не должно вызывать оператор равенства?

#include <iostream>
#include <deque>
#include <cstdlib>
#define LENGTH 128

typedef struct tDataStruct
{

char strA[LENGTH];

char strB[LENGTH];
int nNumberOfSignals;
double* oQueue;

tDataStruct()
{
    nNumberOfSignals = 0;
    //oQueue = NULL;
    memset(strA, 0, LENGTH);
    memset(strB, 0, LENGTH);
}

~tDataStruct()
{
    if (NULL != oQueue)
    {
        delete[] oQueue;
        oQueue = NULL;
    }
}

tDataStruct(const tDataStruct& other) // copy constructor
{
    if (this != &other)
    {
        *this = other;
    }

}
tDataStruct& operator=(tDataStruct other) // copy assignment
{
    if (this == &other)
    {
        return *this;
    }
    strncpy_s(strA, other.strA, LENGTH);
    strncpy_s(strB, other.strB, LENGTH);
    nNumberOfSignals = other.nNumberOfSignals;
    if (NULL != oQueue)
    {
        delete[] oQueue;
        oQueue = NULL;
    }
    if (other.nNumberOfSignals > 0)
    {
        //memcpy(oQueue, other.oQueue, nNumberOfSignals);
    }
    return *this;
}
} tDataStruct;


int main()
{
    tDataStruct tData;

    std::deque<tDataStruct> fifo;

    fifo.push_back(tData);
}

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Ваш конструктор копирования вызывает присваивание:

tDataStruct(const tDataStruct& other) // copy constructor
{
    // NOTE: this redundant check is always true. 
    // Please remove the if.
    if (this != &other) 
    {
        *this = other;
    }
 }

Затем, поскольку оператор присваивания получает объект по значению (а не по ссылке), вызывается конструктор копирования для копирования параметра:

tDataStruct& operator=(tDataStruct other) // copy assignment
{

Вот как вы получили взаимную рекурсию.

Попробуйте вместо этого перейти по ссылке:

tDataStruct& operator=(const tDataStruct &other) // copy assignment
0 голосов
/ 10 октября 2018

В вашем конструкторе копирования вы используете

*this = other; //(1)

, который вызывает

tDataStruct& operator=(tDataStruct other)  //(2)

, поскольку other передается по значению, необходимому для создания копии.Затем он вызывает 1, который вызывает 2, который затем вызывает 1, который затем вызывает 2 и раунд и раунд, по которому вы будете идти, пока программа не завершится сбоем / завершится.

Вам необходимовозьмите other по ссылке, чтобы вы на самом деле не делали копию, такую ​​как

tDataStruct& operator=(const tDataStruct& other) 

Все это говорит о том, что вы делаете это задом наперед.Вы должны использовать копировать и поменять идиому и реализовать ваш operator = с помощью вашего конструктора копирования.

...