从const指针转换为指针

时间:2014-11-25 22:16:36

标签: c++ pointers inheritance

我试图将矩形构造函数ref传递给const Point *,这样我就可以将实际的Point *添加到addPoint函数中(将通过她的代码)。

以及我如何知道当我使用例如" int& num =其他"我得到了参与"其他"所以我可以改变其他...所以当我使用" const int& num =其他"我只能看到其他内容没有改变其内容的能力。

所以我想当我使用" const Point *& p =其他"我最终拥有其他的内容(这是Point的地址),但在某种程度上我无法改变它。

所以如果以上都是真的,为什么我不能把它发送到接收Point *的addPoint?据我所知,编译器将复制来自" p1"这是Point的一个地址,并将它粘贴在矢量中的新插槽中的新点*中。是不是有幸了?

我得到的任何方式:

invalid conversion from ‘const Point*’ to ‘Point*’ [-fpermissive]

这是我的代码(Rectangle是Polygon固有的)

Rectangle::Rectangle(const int& color, const Point*& p1, const Point*& p2, const Point*& p3, const Point*& p4) : Polygon(color, "Rectangle")
{
    addPoint(p1);
    addPoint(p2);
    addPoint(p3);
    addPoint(p4);
}

和带有addPoint功能的Polygon:

#include "Point.h"
#include "Polygon.h"
#include <iostream>
#include <cstdlib>

using std::cout;
using std::endl;
using std::vector;


Polygon::Polygon() : _points(), _color(0), _type("")
{}

Polygon::~Polygon() {
    clear();
}

Polygon::Polygon(const Polygon& other) : _points(), _color(other._color), _type(other._type)
{
    getDataFrom(other);
}


Polygon::Polygon(const int& color, const string& type) : _points(), _color(color) , _type(type)
{
}


void Polygon::addPoint(Point* p) {
    Point* newp = new Point; //create a copy of the original pt
    newp->setX(p->getX());
    newp->setY(p->getY());
    _points.push_back(newp);
}

void Polygon::clear()
{
    vector<Point*>::iterator iter = _points.begin();
    cout << "DELETING POLYGON: BEGIN" << endl;
    while (iter != _points.end()) {
        delete (*iter);
        iter++;
    }
    cout << "DELETING POLYGON: END" << endl;
}


}    

谢谢!

2 个答案:

答案 0 :(得分:4)

你的addPoint()采用非常量指针:

void Polygon::addPoint(Point* p) {

但是你试图传递const Point*,因此错误。编译器不知道您最终没有修改p指向的内容 - 因此可能违反const让您执行您要执行的操作。

例如,如果addPoint()做了:

void Polygon::addPoint(Point* p) { p->setX(42); }

让你通过const Point*来显然是错误的。

但是,由于您实际上并不需要 p指向非常量Point,您只需更改签名即可反映此内容:

void Polygon::addPoint(const Point* p) {

答案 1 :(得分:0)

const Point*表示&#34;指向const Point&#34;的指针,换句话说,指针指向的对象是常量。您不能将它分配给Point*类型的变量(这意味着&#34;指向非const Point&#34;),因为它允许您修改基础{{1}对象。

如果您想要常量指针非常量 Point,请将其声明为Point