C ++复制Const引用的指针

时间:2015-09-29 01:27:38

标签: c++ pointers reference linked-list operator-overloading

我们无法将指针引用作为常量传递,将引用的指针复制到非常量,并将其发送到类函数。

这个问题有一个简单的解决方法:允许传递的参数作为非常量传递。不幸的是,这是一个项目,头文件必须保持不变。这是基本的想法:

  • 存在一个点的世界;每个点都是一个包含维度和值的结构实例。
  • 还存在点集群;群集不包含点本身的实例,而只包含它们的位置。这允许"内容重叠#34;没有重复物理数据的集群。群集中的所有点都按链接列表进行组织;集群本身指向第一个节点,每个节点指向后续节点,直到为空。

因此:

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;

我只能看到不同的是常量 - 是否有任何解决方法来捕获引用的指针地址?

1 个答案:

答案 0 :(得分:-2)

如果后来实际上有人试图修改Point,它会有未定义的行为,但我认为你可以写

Cluster &Cluster::operator+=(const Point &rhs)
{
    PointPtr newPt = const_cast<PointPtr>(&rhs);
    this->add(newPt);
    return *this;
}