繁体   English   中英

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

[英]Error: invalid conversion from 'const int*' to 'int*'

我想创建一个简单的3x3矩阵类,并能够通过下标运算符访问其内容。 这是代码:

// Matrix.h
class Matrix {
private:
    int matrix[3][3];
public:
    int* operator[](const int index) const;
};

// Matrix.cpp
int* Matrix::operator[](const int index) const {
    return this->matrix[index];
}

无论Matrix的对象是const还是非const,我都希望能够访问数组的元素。 但是我从编译器得到以下错误:

错误:从'const int *'到'int *'的无效转换[-fpermissive]

我做了一些研究,我有一个假设:也许,因为我已经将这个成员函数声明为一个const函数,在它的定义中,编译器将所有对象的非可变成员视为const成员,这样就会是编译器说它是从'const int *'到'int *'的无效转换的原因。 我的问题:这个假设是否正确? 如果不是,为什么会发生这种情况? 我认为这是有道理的,并且是确保'const Matrix * this'对象的常量的好方法。

编译器信息:从equation.com下载的gcc 5.3.0

你得到错误的原因是绝对正确的:在标记为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];
}

编译器将根据上下文确定要调用的重载。 如果Matrix本身是const ,它将调用const版本,否则调用非const版本。

当声明类方法(和运算符是类方法) 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]; }

或两者。

int* Matrix::operator[](const int index) const {
    return this->matrix[index]; }

在这里,您说不要通过将函数指定为const来修改对象的状态。

但是你返回一个指向你的实例变量的指针 - 通过该指针可以改变你的类的实例变量的值(从而改变状态)。

因此,您可以创建该运算符的非const版本以避免该问题。

您收到此错误是因为您从const member function (或operator )返回pointer

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];
}

现场演示

改变这个:

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。 无论如何,返回指向内部类成员的指针或引用是一种非常糟糕的做法。

希望这可以帮助:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM