Конструктор копирования класса C ++ - PullRequest
2 голосов
/ 27 февраля 2012

У меня ошибка с моим конструктором копирования.

У меня есть класс MyData следующим образом:

class MyData
{
    private:
    std::vector<double> wavelength;
    std::vector<double> amplitude;

    public:
    MyData::MyData(void) {}

    MyData::MyData(const MyData &cSource)
      : wavelength(cSource.wavelength), amplitude(cSource.amplitude)
    {}
}

В моей основной программе я вставляю объекты MyData в кольцевой буфер. Вот как я читаю это в основном:

MyData data;
data = removeq(&q);

Проблема в том, что иногда в копируемых данных отсутствуют некоторые значения. И т.д., если исходный размер длины волны равен 1, скопированные данные показывают 0. Я отладил свою программу, и данные в кольцевом буфере верны, и т.д., он показывает правильный размер 1.

У кого-нибудь есть идеи, если мой конструктор копирования неверен или мне нужна перегрузка оператора присваивания ??

Спасибо!

Код, который я использовал для вставки / удаления в кольцевой буфер:

void insertq(struct queue *p, MyData v)
{
    int t;
    t = (p->rear+1)%MAX;
    if(t == p->front)
    {   }
    else
    {
            p->rear = t;        
            p->arr[p->rear] = v;
    }
}
MyData removeq(struct queue *p)
{
    MyData empty;   

    if(isempty(p))
    {               
        return empty;
    }
    else
    {       
        p->front = (p->front + 1)%MAX;
        empty = p->arr[p->front];
        return empty;
    }
 }

Ответы [ 3 ]

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

Конструктор копирования вызывается при создании нового объекта из существующего объекта. Здесь вы вызываете оператор присваивания:

MyData data;
data = removeq(&q);

Если вы использовали

 Data oldDataObject;
 Data newDataObject = oldDataObject; 

будет вызван конструктор копирования.

В контексте вашего кода вы должны переопределить оператор '=', чтобы решить эту проблему.

MyData& operator = (const MyData& data);
2 голосов
/ 27 февраля 2012

Чтобы вызвать конструктор копирования, вы должны объявить и инициализировать ваш объект (используя другой объект) в той же строке.Ваш текущий код на самом деле вызывает перегруженный оператор =.

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

Спасибо всем за совет.Я удалил конструктор копирования и методы перегрузки присваивания, как это было предложено.

Проблема была в структуре кольцевого буфера, которую я использовал.Я изменил код кругового буфера на этот пример здесь:

http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular

, и это сработало.Кажется, больше нет ошибок.Сначала я думал, что проблема была в операторе копирования или присваивания, поскольку ошибка была прерывистой, и поэтому я не проверял, был ли это циклический буфер, который вызывал ошибку.

...