2014-03-04 2 views
1

C++에서 다음 클래스를 작성합니다.중복되는 식별자

SImageProc.cpp:5:33: error: no matching function for call to 'SImage::SImage()' 

SImageProc 클래스를 구현할 때이 클래스의 instantions로 내 매개 변수를 해석 왜 내가 알아낼 수 없습니다 :

class SImage { 
    ... 
    public: 
     SImage(char*); 
} 

class SImageProc { 
    SImage S; 
    ... 
    public: 
     SImageProc(SImage Im) { S = Im; }; 
} 

는 컴파일 할 때 나는 이것이 내가 내 생성자를 구현하는 라인을 참조받을 수 있습니다.

답변

4

SImage에는 생성자 SImage(char*)을 제공했기 때문에 기본 생성자가 없습니다. 이것은 컴파일러가 더 이상 디폴트 값을 제공하지 않는다는 것을 의미합니다. 뭔가 다른 곳에서 코드에 SImage이 필요하며 오류가 발생합니다.

SImage에 대한 기본 생성자를 제공하거나 필요로하는 코드를 제거해야합니다. 더 자세한 내용없이 어느 솔루션이 적합한 지 말할 수는 없습니다.

내 생각에 SImageProc에는 SImage 데이터 멤버가 있고 생성자 초기화 목록에서 초기화하지 않을 것입니다.을

SImageProc(SImage Im) : S(Im) {}; 

그에 대한 설명은 시간에 의해 당신이 생성자의 몸에 도달, 즉 모든 데이터 멤버와 기지 왔다 초기화 : 이것은 당신이 그 문제를 해결하는 것 방법이다. 초기화 후에는 사용자가 수정할 수 있습니다 (예 : S으로 지정했습니다.) 생성자 초기화 목록에서 데이터 멤버와베이스를 명시 적으로 초기화하지 않으면 기본값은 이 기본값 인으로 초기화됩니다. 사용자 정의 유형의 대소 문자는 기본 생성자가 호출됨을 의미합니다. 이것은 오류의 원인입니다.

+0

이것은 직관적이지 않습니다. 나는 왜 매개 변수가 기본 생성자를 필요로하는지 이해하지 못한다. SImageProc 클래스에 기존 SImage 객체를 값으로 전달하고 싶습니다. –

+1

@Benji 논리는 특별한 사용자 정의 생성자가있는 경우 기본 생성자에서 특별한 작업을 수행하려고하거나 전혀 원하지 않는다는 것입니다. 그러나 이것이 당신을 가치로 전달하지 못하게합니다. 그건 전혀 관련이없는 문제입니다. – juanchopanza

+0

SImageProc 클래스에 기본 생성자로 정의하려는 SImage 필드가 있음을 설명하기 위해 코드를 업데이트했습니다. SImage 클래스의 SImageProc 클래스가이 필드를 설정하기 위해 값으로 전달되는 것이 이상적입니다. 이것은 내 혼란이 어디에, 왜 이것이 매개 변수의 생성자에 의존하는지 모르겠다. –