2014-02-26 3 views
0

현재 프로젝트의 .cpp 파일을 해결하려고하는데 만난 테스트 파일로 실행할 때마다 seg 오류가 발생합니다. 나는 어디서 오류가 발생했는지 알았다고 생각하지만, 내 인생에서 해결책을 찾지 못한다. 아래와 같이생성자가 자체 유형을 사용합니까?

기본적으로 클래스 제품은 테스트 파일에 초기화

Product * orderItem = new Product(*wonkaBar_retail); 
wonkaBar_retail는 제품 객체에 대한 포인터입니다

이 - 그래서 기본적으로 제품의 생성자가 자신의 유형의 객체에 소요 ... 나는 그것이 작동해야한다고 확신 할 수 없다. 내가 말했듯이, wonkaBar_retail을 인스턴스화하는 부분을 포함하여이 코드를 제공했다, 그래서 나는이 같은

Product(Product) { 
//Constructor in the header file 
} 

, 심지어 같은를 생성자를하여 보상 노력이 바로 나에게 소수 준

Product(const Product&) { 
//Other style 
} 

컴파일러 오류의 컴파일러는 심지어 설명하는 것을 귀찮게하지 않았다 ...

누군가가 이것이 어떻게 작동해야하는지 명확히 할 수 있고, 이것이 심지어 첫 번째 부분에서 segfault를 일으킬 수 있다면?

+0

아니라'제품 (CONST 제품 &) '생성자는 사본이다 'Product'에서 건네받은 것을 복사 해 다른 것을 참조하지 않는 것을 의미합니다. – Mgetz

+1

디버거를 사용하여 코드가 segfaulting하는 곳을 찾아 보거나 코드를 게시하십시오. 디버깅 1 줄의 코드는 우리에게는 불가능합니다. –

+0

생성자 안에'wonkaBar_retail' 객체와 코드를 어떻게 생성했는지 보여줄 수 있습니까? – HadeS

답변

3

제공 한 라인은 Product 클래스의 복사 생성자 을 사용합니다. 이는 매우 적합합니다. 사실, 클래스에 대해 자신 만의 복사 생성자를 제공하지 않으면 컴파일러가 생성자를 생성합니다.

복사 생성자는 동일한 유형의 다른 객체에 대한 참조를 가져 와서 새 객체를 다른 객체와 동일한 상태로 초기화합니다. 컴파일러 생성 된 복사 생성자가 아닌 사소한 클래스, 예를 들면위한 그러나, 잘 작동합니다 간단한 클래스에 대한

Product(const Product& other); 

: 복사 생성자 서명은 일반적으로 다음과 같습니다 동적으로 할당 된 객체에 대한 포인터를 포함하고 있기 때문에 직접 구현해야합니다.

class Buffer 
{ 
public: 
    Buffer(int dataSize) : m_dataSize(dataSize) { m_data = new char[m_dataSize]; } 
    ~Buffer() { delete[] m_data; } 

private: 
    int m_dataSize; 
    char* m_data; 
}; 

이 클래스의 기본 복사 생성자는 다음과 같이 표시됩니다 : 이것은 당신이 원하는 명확하지 않다

Buffer::Buffer(const Buffer& other) 
{ 
    m_dataSize = other.m_dataSize; 
    m_data = other.m_data; 

} 

은 다음 클래스를 생각해 보자. 하나의 경우 복사 한 객체가 삭제되면 새 객체가 가리키는 데이터도 삭제됩니다. 그런 다음 새 개체를 삭제하면 동일한 데이터를 두 번 삭제하려고 시도하지만 이는 매우 나쁩니다.

당신이 정말 후하고 싶은 것은 새 개체에 대한 새로운 m_data을 할당하고이 같은 다른 개체에서 데이터를 복사하는 것입니다

Buffer::Buffer(const Buffer& other) 
{ 
    m_dataSize = other.m_dataSize; 
    m_data = new char[m_dataSize]; 
    for (int i = 0; i < m_dataSize; ++i) 
    { 
     m_data[i] = other.m_data[i]; 
    } 
} 
+0

나는 downvote에 대한 설명을 매우 감사하고 싶다. – jaho

+0

나는 아무것도 다운 다운하지 않았지만 그것을 시도 할 것이다. 감사! – Vincents

+0

죄송합니다 실수로 ... 우린 downvote ..를 만회 할 수 있도록 답을 편집합니다. – HadeS

관련 문제