我试图将矩形构造函数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;
}
}
谢谢!
答案 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
。