2012-02-27 145 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);