초보자 C ++ : 기본 클래스의 가상 함수
-
05-09-2019 - |
문제
다음 기본 클래스를 정의한 코드를 작성하고 있습니다.
class Chorus{
public:
//Destructor
virtual ~Chorus();
//callback function
virtual int callback( void *outputBuffer, void *notUsed, unsigned int
nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData );
virtual void initializeDelayBuffer(void);
virtual void destroyDelayBuffer(void);
};
나는 이것을 기본 클래스로 사용하고 실제로 그 자체로는 아무것도하지 않습니다. 그래서 나는이 클래스 코러스에서 파생 된 두 개의 별도 수업이 있습니다. 파생 된 코러스 클래스에 대한 기본적인 제약을 단순히 제공하기 위해이 작업을하고 싶었습니다. 해야 하다 내 프로그램에서 사용할 수있는 것으로 간주되어야합니다.
프로젝트를 구축 할 때 (Visual Studio 2008),이 코러스 클래스의 모든 가상 함수에 대해 해결되지 않은 외부 기호 오류가 발생합니다. 이 기능에 대한 선언을하지 않은 일반적인 오류라고 생각합니다. 그러나 그들은 가상이고 나는 그들이 파생 클래스 내에서 정의 될 때까지 실제로 무엇이든 할 수 있도록 정의되기를 원하지 않기 때문에이 문제를 해결하려면 어떻게해야합니까?
해결책
당신의 의도가 단순히 아동 클래스를 구현할 수있는 소지자가 되려고한다면, = 0으로 끝나면 순수한 가상 함수를 만듭니다.
virtual void destroyDelayBuffer(void) = 0;
이것은 "추상적"이라는 방법을 말해줍니다. C ++ 컴파일러는 메소드의 실제 정의를 찾지 않고 대신 인스턴스를 생성하기 전에 모든 파생 클래스가 이러한 방법을 구현하도록 강요합니다.
다른 팁
해당 기능을 순수한 가상으로 선언해야합니다.
가상 void 초기화 된 elaybuffer (void) = 0;
그것은 당신이 원하는 종류의 인터페이스를 만들 것입니다.
이것을 순수한 가상 함수라고합니다. C ++에서는 함수 이름 뒤에 "= 0"을 작성하지만 아마도 FAQ를 읽고 싶을 것입니다.
함수를 순수한 가상 함수로 정의해야합니다. 이렇게하려면 각 선언 후에 "= 0"을 추가하십시오. 예를 들어:
virtual void destroyDelayBuffer(void) = 0;
순수한 가상 기능 사용 :
virtual int callback( void *outputBuffer, void *notUsed, unsigned int
nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
위의 답변에 추가하기 위해 순수한 가상 함수가 포함 된 클래스의 객체를 인스턴스화 할 수는 없으므로 미래에 기본 클래스의 객체를 갖기 위해서는 기능이 아닌 가상을 만들어야합니다.