내 첫 번째 C++ 입문은 오디오 합성 라이브러리 (EZPlug)를 제작하는 것입니다.가상 템플릿 기능을 사용하지 못하게하려면 어떻게해야합니까?
라이브러리는 상호 연결된 오디오 생성기 및 프로세서 개체의 그래프를 쉽게 설정할 수 있도록 설계되었습니다. 우리는 EZPlugGenerators를 호출 할 수 있습니다.
모든 프로세서 유닛은 입력으로 하나 이상의 EZPlugGenerators를 허용 할 수 있습니다.
중요한 점은이 EZPlugGenerator의 모든 구성 방법이 체인 가능하다는 것입니다. 다시 말해, 합성 그래프를 설정하는 데 사용되는 메소드는 항상 부모 객체에 대한 포인터를 반환해야합니다.
mixer.addGenerator(
a(new Panner())
->setVolume(0.1)
->setSource(
a(new TriggererPeriodic())
->setFrequency(
v(new FixedValue(1), "envTriggerFreq")
)
->setTriggerable(
a(new Enveloper())
->setAllTimes(v(0.0001), v(0.05), v(0.0f, "envSustain"), v(0.01))
->setAudioSource(
a(new SineWaveMod())
->setFrequency(
a(new Adder())
->addGenerator(a(new Adder()))
->addGenerator(v(5000, "sineFreq"))
->addGenerator(
a(new Multiplier())
->addVal(v("sineFreq"))
->addVal(
a(new TriggererPeriodic())
->setFrequency(v("envTriggerFreq"))
->setTriggerable(
a(new Enveloper())
->setAllTimes(0.1, 0.1, 0, 0.0001)
->setAudioSource(v(1, "envAmount"))
)
)
)
)
)
)
)
);
위의 코드 저장소의 "A"와 "V"기능과 객체에 대한 참조를 반환하고 처리 : 그것은 나에게 매우 친절이 같은 객체 관계의 중첩 된 성격을 보여주는 구문을 사용할 수 있습니다 그들을 검색하고 그들을 파괴.
나는 C++에 대한 나의 접근 방식이 좀 이상하다고 생각하지만 언어가 내가 실제로 프로그램하고 싶은 방식을 실제로 수용 할 수 있다는 것을 알고있다. 내 질문에
이제
내가로부터 상속 입력을 수용 할 수있는 모든 EZPlugGenerators에 대한 공통의 슈퍼 클래스를 생성하고 싶습니다. 이 슈퍼 클래스에는 각 서브 클래스에 의해 오버라이드 (override)되는 메소드 "addInput"가 있습니다. 문제는 "addInput"이 수퍼 클래스가 아닌 서브 클래스의 인스턴스에 대한 포인터를 반환하도록하려는 경우에 발생합니다.
이 허용되지 않습니다 :
EZPlugProcessor* addInput(EZPlugGenerator* generator)
그 슈퍼 클래스가 아닌 내가 너무 행복 해요 chainability을 파괴 sublass의 인스턴스에 대한 포인터를 반환하기 때문에.
나는이 시도 :template<typename T> virtual T* addInput(EZPlugGenerator* obj){
을하지만 컴파일러는 내가 가상 템플릿 함수를 만들 수 없습니다 알려줍니다.
여기에서 상속을 사용하지 않아도됩니다. 입력을받을 수있는 모든 단일 EZPlugGenerator에 'addInput'을 구현할 수 있습니다. 단일 부모 클래스로 모든 것을 모으는 것만으로도 공통점이 있다는 것을 분명히 알 수 있으며 addInput
이 한 객체를 다른 객체에 연결할 수있는 적절한 방법이라는 사실을 입증하는 데 도움이됩니다.
따라서 상속을 사용하여 클래스 그룹의 모든 구성원이 'addInput'메서드를 구현해야하며 해당 메서드가 자식 클래스의 인스턴스에 대한 포인터를 반환하도록 허용 할 수있는 방법이 있습니까?
너무. 많은. '새로운'. 내 눈! – Xeo
오 대장 ... –
죄송합니다. 나는 그것을 가능한 한 간단하게 유지하려고 노력했다. – morgancodes