2012-02-27 17 views
2

コピーコンストラクタに問題があります。C++クラスのコピーコンストラクタ

次のように私はクラスの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; 
    } 
} 
+1

コピーコンストラクタは問題ありません(コンパイラーが自動生成するもの、btwと同じです)。問題は 'removeq()'とその設計にあります。すでに構築されているオブジェクトに対してコピーコンストラクタをどのように呼び出すと思いますか? 'removeq'でコピーコンストラクタを使う方法を教えてください。 – Cameron

+3

ここに明示的にcopy ctorを書く必要はありません。デフォルトのものは同じことをします。 –

+0

割り当てオーバーロードを追加しようとしましたか?書き込みとテストにはわずか1〜2分かかります。コピーコンストラクタは正常に見えます。関連するコードをいくつか投稿すると役立つかもしれません。 – fileoffset

答えて

0

ありがとうございました。私は提案されたコピーコンストラクタと代入オーバーロードメソッドを削除しました。

問題は、私が使用した循環バッファ構造に問題がありました。私はここで、この例に循環バッファのコードを変更:

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

、それが働きました。それ以上のエラーはないようです。私は当初、エラーが断続的であったために問題がコピーまたは代入演算子に起因すると考えていたため、エラーの原因となった循環バッファであるかどうかを確認しませんでした。

2

あなたが同じ行に(別のオブジェクトを使用して)オブジェクトを宣言して初期化する必要がコピーコンストラクタを呼び出すために。現在のコードは、実際にはオーバーロードされた=演算子を呼び出します。

+0

詳細を追加するには、 'MyData data(removeq(&q));')または 'MyData&operator =(const MyData&other) 'を実装する必要があります)。 –

+0

agree :)は次回以降行います – bibbsey

2

コピーコンストラクタは、既存のオブジェクトから新しいオブジェクトを作成するときに呼び出されます。あなたはコピーコンストラクタが呼び出されます

Data oldDataObject; 
Data newDataObject = oldDataObject; 

を使用していた場合

MyData data; 
data = removeq(&q); 

:ここでは、代入演算子を呼び出しています。

コードのコンテキストでは、これを解決するために '='演算子をオーバーライドする必要があります。

MyData& operator = (const MyData& data); 
関連する問題