函数里面的函数定义

时间:2009-04-08 21:40:34

标签: c++

我有以下仿函数来重新定义向量类型的sort方法的less运算符:

typedef vector< vector<int> > MxInt2d;
typedef vector< vector<double> > MxDouble2d;

class QSweep{   
public:
....
static MxDouble2d myPoints_;
    MxDouble2d myEdges_;

class order{
public:
    bool operator() (const vector<int>& edge1, const vector<int>& edge2){
        //std::cout<<"inside sort"<<endl;
        //3 sort criteria
        return (myPoints_[edge1[0]][0]<myPoints_[edge2[0]][0])|| 
                           (myPoints_[edge1[0]][0]==myPoints_[edge2[0]][0]&& 
                            myPoints_[edge1[0]][1]<myPoints_[edge2[0]][1]) 
               ||
                (myPoints_[edge1[0]][0]==myPoints_[edge2[0]][0]&& 
                             myPoints_[edge1[0]][1]==myPoints_[edge2[0]][1]&& 
                 getSlope(myPoints_[edge1[0]][0],myPoints_[edge1[0][1],  
                                      myPoints_[edge1[1]][0],myPoints_[edge1[1]][0])
                 <
                             getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],    
                                      myPoints_[edge2[1]][0],myPoints_[edge2[1]][0]));
            }
};
static double getSlope(double a, double b, double c, double d);

};

其中getSlope是以下列方式定义的函数:

double QSweep::getSlope(double a, double b, double c, double d){
double slope=0.0;
//std::cout<<"slope criteria"<<endl;
double denum=c-a;
if (denum==0){
    std::cout<<"zero denominator"<<endl;
}
else{
    slope=(d-b)/denum;
}
return slope;
}

每个点由索引,x和y坐标给出;每个边由源边[0]和目标边[1]给出,其中边[0],边[1]是点的索引)。 我想安排边缘: - 通过其边[0]坐标的x坐标(如果2个边的x不同) - 通过它们的边[0]坐标的y坐标(如果2个边的x相等) - 通过它们相应的斜率(如果边缘的x和边缘的y相等)。

我声明了getSLope函数是静态的,但是当我用

对边进行排序时
    sort(myEdges_.begin(),myEdges_.end(),order());

最后一个条件未满。 如果我有两个边缘具有相同的x和y用于edgep [0]但具有不同的斜率,例如斜率(edge1)= 1,斜率(edge2)= 1/2比我想要得到的 [edge2,edge1];相反,我得到[edge1,edge2]。 所以我的getSlope标准没有计算出来。

是因为我声明了getSlope静态吗?我应该改变什么才能达到标准? 提前感谢您的建议, madalina

2 个答案:

答案 0 :(得分:1)

crikey!它看起来相当复杂,首先你尝试使用一组不太复杂的值进行计算 - 也就是说我看到你有cout语句,我相信它们在你运行它时能正常工作吗?

如果是这样,那么你对getSlope的输入是错误的 - 不应该

getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],    
         myPoints_[edge2[1]][0],myPoints_[edge2[1]][0])

getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],    
         myPoints_[edge2[1]][0],myPoints_[edge2[1]][1])

答案 1 :(得分:0)

也许它发生了,因为表达结果可以在没有它的情况下计算出来 E.g:

false && someFunction(); - function will not be called
true || someFunction(); - function will not be called

这是很好的规则,它允许我们写下:

if ( ptr && ptr->someMethod() ) 
// call method will not be called for NULL pointers