내 프로그램에서 나는 모든 어려움에 직면하고있다. (나는 그들을 모두 저장하고 많은 문제를 묻는다 : P). 내가 가진 것은 functor이다. 가상 오퍼레이터()를 가지고있는 모든 functor는 DuplicateFn
에서 상속 받았으며, 각 자식은 그것의 버전을 쓸 것으로 예상된다.새롭고 공유 된 포인터와 가상 함수
이제 자식 중 하나 인 merge가 성공하지 못할 수 있습니다.이 경우 폴백 메서드를 시도해야합니다. 나는 문제가 여기에 이미 명확하게 볼 수 있습니다 생각
class MergeFn : public DuplicateFn {
public:
MergeFn() : FallBack(new SkipFn())
{
}
MergeFn(GMProject const* Out, GMProject const* In, DuplicateFn* f)
: DuplicateFn(Out, In), FallBack(f)
{
}
virtual void operator() (GMProject::pTree& tOut, const GMProject::pTree& tIn) const {
if (!GMProject::isMergeable(tOut.GetName())) {
(*FallBack)(tOut, tIn); //virtual table resolves this to the correct class
} else {
}
}
private:
std::shared_ptr<DuplicateFn> FallBack;
};
- 기본이 아닌 생성자에서,이 방법은 주어진 매개 변수의 소유권을 포착 : 같이 현재 클래스 따라서 보인다. - 이것은 내가 원하는 것이 아닙니다. 매개 변수를 복사하고 소유권을 유지해야합니다.
이제 나는 , FallBack(new DuplicateFn(f))
을 시도했다. 그러나 이것도 작동하지 않을 것이다. 순수한 가상 메소드를 가진 클래스로부터 객체를 인스턴스화하려고하는 컴파일 에러가있다.
어떻게하면됩니까? - 각 유형에 대해 특정 생성자를 지정해야합니까? 그냥 핵심으로 복사하는거야? 아니면 RTTI를 통과해야합니까? 나는보다 더 나은 방법이 희망하는 2
편집 mergeFn가 초기화 (및 사용)됩니다 방법을 보여줍니다 :
std::unique_ptr<detail::DuplicateFn> foo;
foo.reset(new detail::MergeFn(this, &Other, DuplicateFns.at(HandleDuplicate)));
DuplicateFns 기능으로 사용자 입력 (문자열)로 변환하는 데 도움이되는지도이다 -pointers. - 지금 그대로 또는 DuplicateFn에서 서브 타입의 객체 (포인터 타입이 DuplicateFn *입니다)에 대한 포인터는
이 다음 콜백 방법 하나에 두 그루의 나무를 결합
ProjectTree.combine_if(tree, &SimilarTreeValue, foo.get());
로 사용됩니다 - SimilarTreeValue가 true를 돌려주는 경우 엔트리는 복제 된 것으로 간주됩니다. 엔트리가 잎이라면 세 번째 매개 변수가 호출됩니다 - 우리가 말하는 Functor입니다.
"_You 사용자 정의 소멸자 소요 shared_ptr의 생성자를 사용하고 it._가 비어있는 기능을 전달할 수 있습니다 "나는이 글을 읽을 때마다, 내 생각 :
당신은 복제 기능을 필요 싸구려 트릭을 가진 디자인 문제에서 벗어나지 못할 것 "이라고 말했다. 이것은 또 다른 예입니다. – curiousguy