2011-08-12 5 views
0

다음 코드를 감안할 때 스텝 오버 해시 [tmpSet] = 폴리 라인, 복사 생성자 내의 p.start는 NULL입니다. 그런 다음 p.start가 그 안에 이상한 값을 설정하면 두 번째로 호출됩니다.C++ 복사 생성자 이상한 행동

실마리가 무엇입니까?

감사합니다, 에리히

편집 1 : 그것을 고정 다항식 클래스에 할당 연산자를 추가하는 생각,하지만하지 않았다. 여전히 같은 문제가 있습니다.

+1

p.start가 null 인 경우 대입 연산자를 수정했지만 여전히 기본값은 아닙니다. 'if (p.start!= NULL) {'else {start = NULL;}'로 끝나야합니다. (음, 할당 연산자에서 먼저 할당 해제하는 것을 잊지 마세요.) –

+0

글쎄요, 내가 틀렸거나 뭔가 있습니다. 제발 바보라고 부르지 마세요. 내부 포인터가있는 해시 컨테이너 객체를 넣습니다. 컨테이너에 객체를 넣으면 복사가됩니다 (귀하의 경우 포인터 주소 만). 프로그램이 범위를 벗어나면 포인터를 몇 번 파괴하려고 시도합니다. 그래서 거기에 참조 카운트 또는 어떤 포인터가 있어야합니다. 내가 틀렸다면 수정하십시오. – legion

+0

감사합니다. 나는 else 문을 추가했으며 현재 작동 중입니다. 이 문제가 왜 수정되었는지 조금 더 설명해 주시겠습니까? 또한, "대입 연산자 우선 할당 해제"란 무엇을 의미합니까? –

답변

4

당신은 Rule of Three 위반됩니다
당신이 과부하 때문에 복사 생성자을, 당신은 당신의 클래스에 대한 해야하는 과부하 복사 할당 연산자소멸자.

위의 문은 코드 예제에서, 당신은 해야으로 해야를 대체 할 수있는 일반적인 시나리오를 참조했다.

+0

"필수"가 너무 강합니다. "해야한다"는 것이 더 적절합니다. –

+0

@ 올리 찰스 워스 :이 경우에는 반드시 **해야합니다 **는 맞습니다 :) –

+0

@Als : 매우 사실! 어쨌든, +1. –

0

초기화를 초기화하는 기본 생성자를 NULL에 추가해야합니다.

+0

위의 편집을 참조하십시오. –

2

두 가지 문제가 있습니다.

1) 인수가없는 생성자가 없으므로 컴파일러는 초기 값을 적합하다고 신고합니다. p.start가 처음에 NULL 인 것은

입니다. 2) 복사 생성자가 p.start == NULL을 사용하여 polynomial을 전달하면 클래스의 변수를 초기화하지 않으므로 다음 복사본에 컴파일러의 초기 값을 지정할 수 있습니다 할당 (문제 # 1 참조).

수정하려면 다항식을 제너럴 상태로 초기화하는 인수없는 생성자를 추가해야합니다. 그런 다음 복사 생성자가 이러한 다항식을 전달하면 자체를 정상 상태로 초기화해야합니다.

+0

위의 편집을 참조하십시오. –

+0

두 번째 점은 여전히 ​​의미합니다. 빈 다항식을 복사 생성자에 전달하면'p.start'가 NULL임을 알 수 있습니다. 그런 다음'this-> start'를 NULL로 설정하지 않습니다 (기본 생성자는 복사 생성자 중에 실행되지 않습니다). –

0

Als가 지적했듯이, 당신은 3의 규칙을 위반합니다. 글쎄, 컨테이너에 물건을 넣을 때 포인터에 어떤 일이 생기는지.

monomial *start; 
monomial *next; 

이것에 대해 생각하십시오.

+0

위의 편집을 참조하십시오. –

0

복사 생성자는 p.start == NULL 인 경우 시작 값을 임의의 값으로 설정합니다. 이는 프로그램의 다른 코드에 따라 문제의 원인 일 수 있습니다. 또한 할당 연산자가 없으므로 컴파일러에서 얕은 복사본을 처리합니다. 다른 함수를 추가해야합니다. polynomial &operator=(const polynomial& b)

+0

위의 편집을 참조하십시오. –