我想创建一个简单的3x3矩阵类,并能够通过下标运算符访问其内容。这是代码:
function doDrag(){
if(d3.event.sourceEvent.button == 0){
d3.event.stopImmediatePropagation();
return;
}
//other drag work
}
无论Matrix的对象是const还是非const,我都希望能够访问数组的元素。但是我从编译器中得到以下错误:
错误:来自' const int *'的无效转换到' int *' [-fpermissive]
我做了一些研究,我有一个假设:也许,因为我已经将这个成员函数声明为const函数,在其定义中,编译器会对(它掩盖)所有对象的非可变成员进行处理作为const成员,这就是编译器说它来自' const int *'的无效转换的原因。到' int *'。 我的问题:这个假设是否正确?如果不是,为什么会发生这种情况呢?我认为这是有道理的,并且是确保' const Matrix *这个'的一致性的好方法。对象
编译器信息:从equation.com下载的gcc 5.3.0
答案 0 :(得分:4)
你得到错误的原因是完全正确的:在标记为const
的成员函数中,编译器隐式地将类的所有数据成员视为使用const
限定符声明它们。
修复非常简单 - 您可以覆盖相同的运算符两次,提供const
和非const
版本:
class Matrix {
private:
int matrix[3][3];
public:
const int* operator[](const int index) const;
int* operator[](const int index);
};
// Matrix.cpp
const int* Matrix::operator[](const int index) const {
return this->matrix[index];
}
int* Matrix::operator[](const int index) {
return this->matrix[index];
}
编译器将根据上下文确定要调用的重载。如果const
本身为Matrix
,则会调用const
版本,否则会调用非const
版本。
答案 1 :(得分:3)
当您声明一个类方法(并且operator是一个类方法)const
时,这意味着您只能在类的字段上调用const
方法并仅返回const
个指针或引用到课堂领域。为了编译,你需要下定决心:
const int* Matrix::operator[](const int index) const { return this->matrix[index]; }
或
int* Matrix::operator[](const int index) { return this->matrix[index]; }
或两者兼而有之。
答案 2 :(得分:2)
int* Matrix::operator[](const int index) const {
return this->matrix[index]; }
在这里,您说不要通过将函数指定为const
来修改对象的状态。
但是你返回一个指向你的实例变量的指针 - 通过那个指针可以改变你的类的实例变量的值(从而改变状态)。
因此,您可以创建该运算符的非const版本以避免该问题。
答案 3 :(得分:0)
您收到此错误是因为您从pointer
(或const member function
)返回operator
。
const member function
和operator
不应更改任何non-mutable
成员,也不得返回pointers
,以后可以更改它们。
让你的操作符返回const指针而不是指针。
class Matrix {
private:
int matrix[3][3];
public:
int const* operator[](const int index) const;
};
// Matrix.cpp
int const* Matrix::operator[](const int index) const {
return this->matrix[index];
}
答案 4 :(得分:0)
改变这个:
int* Matrix::operator[](const int index) const
到这个
const int* Matrix::operator[](const int index) const
您不能从const函数返回指向数据成员的可变指针。
或者你可以创建两个版本的operator:const和non const:
const int* Matrix::operator[](const int index) const;
int* Matrix::operator[](const int index);
PS。无论如何,将指针或引用返回给内部类成员是一种非常糟糕的做法。
答案 5 :(得分:0)
希望这会有所帮助:
#include<iostream>
using namespace std;
class Matrix
{
private:
int matrix[3][3];
public:
const int* operator[](const int index) const;
Matrix(int* value); // need an initializer though :)
};
const int* Matrix::operator[](const int index) const
{
return this->matrix[index];
}
Matrix::Matrix(int* value)
{
for(int i=0; i<3;i++)
{
for (int j=0; j<3; j++)
{
matrix[i][j]= *value;
value++;
}
}
}
int main( void )
{
int arr[] = {1,2,3,4,5,6,7,8,9};
Matrix C(arr);
const int *c;
c = C[0];
for(int i=0;i<3;i++)
{
cout << *c << ends;
c++;
}
return 0;
}