bool operator()和继承

时间:2010-02-13 10:53:04

标签: c++ operator-overloading compiler-errors

对于派生类

,我对bool operator()有以下问题

基础课程

class Point
{
double x, y;
public:
Point(){x=0;y=0;}
...
}

派生类

class 3DPoint : public Point
{
double z;
public:
3DPoint(double x, double y, double zx) : Point(x,y){z(zz);}
...
}

派生类

的operator()
class compareByX
{
bool operator () (const 3DPoint *p1, const 3DPoint *p2) const
{
return p1->x < p2->x;   //Compilation error
}
}

点数容器

class List: public list<3DPoint *>
{
...
}


int main()
{
List l;;
l.push_back(new 3DPoint(1,2,3));
l.push_back(new 3DPoint(4,5,6));
sort(l.begin(), l.end(), compareByX);  
}

编译在类compareByX中停止并显示以下消息:无法将3DPoint const转换为Point。我删除了const声明......

class compareByX
{
bool operator () (3DPoint *p1, 3DPoint *p2) const
{
return p1->x < p2->x;   //Compilation error
}
}

......并且...成功编译。但我认为operator()没有明确定义。你能帮我吗?也许最好提出更合适的对象模型...... Thanx。

4 个答案:

答案 0 :(得分:2)

您的x,y,zprivate个成员,并且您正在尝试从课堂外访问它们。制作point struct s,或制作x,y,z public,或为他们提供制定人/获取者。

编辑:
更多关于代码的事情:

  1. class List继承std::list,标准容器意味着用作基类。如果您需要std::container中没有的特殊功能,请提供可以执行此操作的免费功能,而不是从中继承。
  2. 考虑到这里的问题类型,实现自己的容器可能不是最好的主意。使用一些标准版,有很多them,它们很可能符合您的需求。
  3. 从另一个类继承一个类时,基类通常应为virtual
  4. Point3D不是某种 Point2D,更像Point2DPoint3D 更像点。对我来说,这种继承会更有意义。
  5. 只是为了停止猜测你在那里遇到的编译器错误,尝试一下这段代码,我认为这大约是你正在寻找的。

    #include <algorithm>
    #include <iostream>
    #include <vector>
    
    class Point
    {
    public:
        Point() {}
        virtual ~Point() {}
    
        virtual void some_function_relevant_to_all_points() {}
    
    private:
        // maybe some members here
    };
    
    class Point2D : public Point
    {
    public:
        Point2D(double x, double y)
            : x_(0),
              y_(0)
        {}
        ~Point2D() {}
    
    private:
        double x_;
        double y_;
    };
    
    class Point3D : public Point
    {
    public:
        Point3D(double x, double y, double z)
            : x_(x),
              y_(y),
              z_(z)
        {}
        ~Point3D() {}
    
        double get_x() const {return x_;}
        double get_y() const {return y_;}
        double get_z() const {return z_;}
    
    private:
        double x_;
        double y_;
        double z_;
    };
    
    class Compare3DPointByX
    {
    public:
        bool operator()(const Point3D *lhs, const Point3D *rhs) const
        {
            return lhs->get_x() < rhs->get_x();
        }
    };
    
    class DeleteElement
    {
    public:
        template <typename T>
        void operator()(T *arg)
        {
            delete arg;
        }
    };
    
    int main()
    {
        std::vector<Point3D *> points3d;
        points3d.push_back(new Point3D(4,5,6));
        points3d.push_back(new Point3D(1,2,3));
    
        std::cout << "point 1:" << points3d[0]->get_x() << "\n";
        std::cout << "point 2:" << points3d[1]->get_x() << "\n";
    
        std::sort(points3d.begin(), points3d.end(), Compare3DPointByX());
    
        std::cout << "point 1:" << points3d[0]->get_x() << "\n";
        std::cout << "point 2:" << points3d[1]->get_x() << "\n";
    
        std::for_each(points3d.begin(), points3d.end(), DeleteElement());
        return 0;
    }
    

    您可以自己添加的其他功能,这个例子只是为了让您了解它的实现方式。

    希望它有所帮助,祝你好运。

答案 1 :(得分:0)

  • 类和结构定义后面应跟;
  • 标识符名称不能以数字
  • 开头

答案 2 :(得分:0)

我更正了代码(感谢支票),同样的问题......

class Point3D : public Point
{
double z;
public:
Point3D(double x, double y, double zx) : Point(x,y){z(zz);}
...
}

class compareByX
{
bool operator () (Point3D *p1, Point3D *p2) const
{
return p1->getX() < p2->getX();   //Compilation error
}
}


class List: public list<Point3D *>
{
...
}


int main()
{
List l;;
l.push_back(new Point3D(1,2,3));
l.push_back(new Point3D(4,5,6));
sort(l.begin(), l.end(), compareByX);  
}

答案 3 :(得分:0)

您无法对此类std::list进行排序,您需要支持std::vector等随机访问的内容。或者使用sort成员函数:

l.sort(compareByX());  

请注意我添加到compareByX的parantheses,你需要构造一个仿函数,这就是括号的用途。

此外,您必须使operator()成为公共成员函数,以便sort算法可以调用它。实现这一目标的最简单方法是使您的仿函数成为一个结构:

struct compareByX
{
    bool operator () (Point3D const *p1, Point3D const *p2) const
    {
        return p1->getX() < p2->getX();   
    }
};

我怀疑您还必须公开您的getX会员功能,但这很难说,因为您没有展示您的代码部分。

最后,我认为您不需要针对此特定示例的指针/堆分配。如果您在堆栈上创建积分,您的程序将更快,更强大。

PS:请在下次发布真实代码,这会让那些想要帮助的人更容易。