2016-08-21 93 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开发者。 –

相关问题