2016-08-21 126 views
0

注:相應的要點是提供here派生類調用父的方法


我有很多的方法,這是從std::unary_function<K::Point_3, K::FT>typedef K::Point_3 Point;導出(底層庫CGAL要求的話) - 這個班級被稱爲Function

我現在需要一些派生類(例如:MySphere)的實例添加到Function_vector

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Implicit_to_labeling_function_wrapper.h> 

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef K::FT FT; 

class Function: public std::unary_function<K::Point_3, K::FT> 
{ 
public: 
    typedef K::Point_3 Point; // necessary 
    // I'd rather not define operator() here 
    virtual K::FT operator()(K::Point_3 p) const {return 0.0;} 
}; 

class MySphere: public Function 
{ 
public: 
    virtual K::FT operator()(K::Point_3 p) const {return 3.14;} 
}; 

typedef CGAL::Implicit_multi_domain_to_labeling_function_wrapper<Function> 
               Function_wrapper; 
typedef Function_wrapper::Function_vector Function_vector; 

int main() 
{ 
    MySphere f1; 

    Function_vector v; 
    v.push_back(f1); 

    std::cout << f1(CGAL::ORIGIN) << std::endl; // MySphere::operator() 
    std::cout << v[0](CGAL::ORIGIN) << std::endl; // Function::operator() :(

    return 0; 
} 

問題:

Function_vector不接受指針,所以實際的抽象Function類不能是虛擬的,需要從std::unary_function執行operator()。當將MySphere實例添加到Function_vector時,MySphere變爲FunctionFunctionoperator()被調用,而不是MySphere

如何擁有v[0]致電MySphere::operator()

回答

0

作爲一種變通方法,可以創建另一個包裝MyFun並送入Function點菜

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Implicit_to_labeling_function_wrapper.h> 

#include <memory> 

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef K::FT FT; 

class MyFun: public std::unary_function<K::Point_3, K::FT> 
{ 
    public: 
    virtual K::FT operator()(K::Point_3 p) const = 0; 
}; 

class MySphere: public MyFun 
{ 
public: 
    virtual K::FT operator()(K::Point_3 p) const {return 3.14;} 
}; 

class Function: public std::unary_function<K::Point_3, K::FT> 
{ 
    public: 
    typedef K::Point_3 Point; 

    explicit Function(std::shared_ptr<MyFun> fun): 
    fun_(fun) 
    { 
    } 

    virtual K::FT operator()(K::Point_3 p) const { 
    return fun_->operator()(p); 
    } 

    private: 
    std::shared_ptr<MyFun> fun_; 
}; 


typedef CGAL::Implicit_multi_domain_to_labeling_function_wrapper<Function> Function_wrapper; 
typedef Function_wrapper::Function_vector Function_vector; 

int main() 
{ 
    auto f1 = std::make_shared<MySphere>(); 

    Function_vector v; 
    v.push_back(Function(f1)); 

    std::cout << (*f1)(CGAL::ORIGIN) << std::endl; 
    std::cout << v[0](CGAL::ORIGIN) << std::endl; 

    return 0; 
} 
3

既然你把一個Function對象放入向量中,所以有object slicing,你根本就做不到。虛擬功能需要指針或引用才能正確使用繼承樹。

我可以給你的唯一建議是你重新考慮你的設計。

+0

謝謝,這是我的想法。我會回到CGAL開發者。 –

相關問題