错误:来自' const int *'的无效转换到' int *'

时间:2016-02-12 08:27:03

标签: c++ gcc

我想创建一个简单的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

6 个答案:

答案 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 functionoperator不应更改任何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];
}

Live Demo

答案 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;
}