对于派生类
,我对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。
答案 0 :(得分:2)
您的x,y,z
是private
个成员,并且您正在尝试从课堂外访问它们。制作point
struct
s,或制作x,y,z
public
,或为他们提供制定人/获取者。
编辑:
更多关于代码的事情:
class List
继承std::list
,标准容器不意味着用作基类。如果您需要std::container
中没有的特殊功能,请提供可以执行此操作的免费功能,而不是从中继承。virtual
。Point3D
不是某种 Point2D
,更像Point2D
而Point3D
更像点。对我来说,这种继承会更有意义。只是为了停止猜测你在那里遇到的编译器错误,尝试一下这段代码,我认为这大约是你正在寻找的。 p>
#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:请在下次发布真实代码,这会让那些想要帮助的人更容易。