2012-02-27 4 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를 쓸 필요가 없으며, 기본 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

기존 개체에서 새 개체를 만들 때 복사본 생성자가 호출됩니다. 여기에서, 당신은 할당 연산자를 호출 :

MyData data; 
data = removeq(&q); 

당신은 복사 생성자가 호출 얻을 것이다

Data oldDataObject; 
Data newDataObject = oldDataObject; 

사용했다면.

코드의 컨텍스트에서이 문제를 해결하려면 '='연산자를 재정의해야합니다.

MyData& operator = (const MyData& data);