我们无法将指针引用作为常量传递,将引用的指针复制到非常量,并将其发送到类函数。
这个问题有一个简单的解决方法:允许传递的参数作为非常量传递。不幸的是,这是一个项目,头文件必须保持不变。这是基本的想法:
因此:
class Point
{
int dim; // number of dimensions of the point
double *values; // values of the point's dimensions
}
和
typedef Point * PointPtr; // Points to a point
typedef struct LNode * LNodePtr; // Points to a link node
struct LNode // Link node structure
{
PointPtr p; // Points to a point
LNodePtr next; // Points to the next link node
};
class Cluster
{
int size;
LNodePtr points;
public:
Cluster &operator+=(const Point &rhs); // Add a point
}
我们需要重载+ =运算符以向集群添加一个点,并给出了上述声明。到目前为止,有一些行为的代码如下:
Cluster &Cluster::operator+=(const Point &rhs) // This line is not allowed to change
{
PointPtr newPtPtr = new Point(rhs);
this->add(newPtPtr); // Adds the point to the cluster
return *this;
}
但是,这会在宇宙中创造一个新的物理点。
我们希望看到工作的内容如下:
Cluster &Cluster::operator+=(const Point &rhs)
{
PointPtr newPt = &rhs; // This could also be type "Point *"
this->add(newPt);
return *this;
}
但我收到了无效转换"消息:
error: invalid conversion from 'const Clustering::Point*' to 'Clustering::PointPtr {aka Clustering::Point*}' [-fpermissive]
PointPtr newPt = &rhs;
我只能看到不同的是常量 - 是否有任何解决方法来捕获引用的指针地址?
答案 0 :(得分:-2)
如果后来实际上有人试图修改Point
,它会有未定义的行为,但我认为你可以写
Cluster &Cluster::operator+=(const Point &rhs)
{
PointPtr newPt = const_cast<PointPtr>(&rhs);
this->add(newPt);
return *this;
}