![](/img/trans.png)
[英]error: invalid conversion from ‘int’ to ‘const char*’
[英]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 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];
}
改变这个:
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.