2012-02-27 139 views
2

我有我的复制构造函数不稳定的问题。C++类复制构造函数

我有一个类迈德特如下:

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; 
    } 
} 
+1

复制构造函数没问题(它与编译器自动生成的一样,btw)。问题在于'removeq()'及其设计 - 你如何期望在已经构建的对象上调用复制构造函数?向我们展示如何在'removeq'中使用复制构造函数。 – Cameron 2012-02-27 02:44:47

+3

你不需要在这里明确地写出copy ctor,默认的会做同样的事情。 – 2012-02-27 02:50:05

+0

您是否尝试添加赋值超载?编写和测试只需一两分钟。复制构造函数看起来OK。如果您发布更多相关代码,这可能会有所帮助。 – fileoffset 2012-02-27 02:54:09

回答

0

感谢所有的建议。建议删除复制构造函数和赋值重载方法。

问题出在我用过的循环缓冲区结构。我改变了循环缓冲区的代码在这里这个例子:

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

和它的工作。似乎没有更多的错误。我最初以为这个问题是由于复制或赋值操作符,因为错误是间歇性的,所以我没有检查是否是导致错误的循环缓冲区。

2

为了调用必须声明和初始化对象的拷贝构造函数在同一行(使用另一个对象)。你当前的代码实际上调用了overloaded =运算符。

+0

要添加更多的细节,你应该写'MyData data(removeq(&q));'或者你应该实现'MyData&operator =(const MyData&other);'。 – 2012-02-27 04:40:25

+0

同意:)从下一次开始 – bibbsey 2012-02-28 04:08:48

2

从现有对象创建新对象时会调用复制构造函数。在这里,您呼叫的赋值操作符:

MyData data; 
data = removeq(&q); 

如果您用过

Data oldDataObject; 
Data newDataObject = oldDataObject; 

拷贝构造函数将会被调用。

在您的代码的上下文中,您应该重写'='运算符来解决此问题。

MyData& operator = (const MyData& data);