2014-04-09 3 views
0

내 문제는 여기에있다. C++에서 가상 클래스의 파생 클래스를 반환

나는 나는 또한 순수 가상 함수 연산자 (과 템플릿 추상 클래스 프로세스가

template<T> 
class RandomVariable<T> { 
public: 
    virtual T operator()() = 0; 
    /* other stuff */ 
protected: 
    T value; 
} 

순수 가상 함수 연산자()()와 템플릿 추상 클래스 RandomVariable)()

template<T> 
class Process<T> { 
public: 
    typedef std::pair<double, T> state; 
    typedef std::list<state> result_type; 

    virtual result_type operator()() = 0; 
    /* other stuff */ 
protected: 
    result_type trajectory; 
} 

경로를 생성하고 내 궤도의 마지막 값을 반환하는 메서드를 쉽게 작성할 수 있습니다.

T GenerateTerminalValue() { 
    this->operator()(); 
    return value.back().second; 
}; 

그러나 대신() 내 기능은 실제로 오버로드 된 연산자 (이상적으로 RandomVariable에서 파생 된) 펑터를 반환 타입 T를 반환 경로를 생성하고 궤도의 마지막 값을 반환하는 경우 훨씬 더 좋을 것이다. 최선의 시도는 세분화 오류로 이어졌습니다.

이 작업을 수행하는 좋은 방법은 무엇입니까? 감사.

+0

"내 최고의 단지 분할 고장을 주도 해보십시오." 나는 오류를 찾으려고 노력하고있다. 그러나 나의 마술 수정은 오늘 너무나 잘 작동하지 않고있다. –

답변

1

std::function을 사용하면 어떨까요?

#include <functional> 

template<typename T> 
class MyClass { 
public: 
    std::function<T()> GenerateTerminalValueFunc() { 
     return [this]() { 
      this->operator()(); 
      return value.back().second; 
     }; 
    } 
    ... 
}; 

업데이트 : 당신이 RandomVariable에서 파생 할 경우이 같은 것을 시도 할 수 :

#include <memory> 

template<typename T> 
class TerminalValueOp : public RandomVariable<T> 
{ 
private: 
    MyClass<T>* obj_; 
public: 
    TerminalValueOp(MyClass<T>* obj) : obj_(obj) {} 
    T operator()() { 
     obj->operator()(); 
     return obj->value.back().second; 
    } 
    ... 
}; 

template<typename T> 
class MyClass { 
public: 
    std::shared_ptr<RandomVariable<T>> GenerateTerminalValueOp() { 
     return std::make_shared<TerminalValueOp<T>>(this); 
    } 
    ... 
}; 
+0

'T'는 어떤 종류입니까? – Constructor

+0

당신의 솔루션은 정말 간단하고 잘 작동합니다. 하나의 질문이지만 저는 C++의 초보자이며 브라켓 화 된 키워드 [이]를 본 적이 없습니다. 그 의미는 정확히 무엇입니까? 또한 RandomVariable 클래스에서 반환 유형을 파생 시키려한다면 어떻게할까요? – AFK

+0

@YBL 당신이 언급 한'[this]'는 [lambda expression] (http://en.cppreference.com/w/cpp/language/lambda "lambda expressions on cppreference.com")의 캡쳐 절입니다. 'this' 포인터를 캡쳐리스트에 추가하는 것은 기본적으로 람다 표현식에 그것을 사용할 수있는 권한을 부여합니다. – Lilshieste