C++ 将常量void*转换为常量int*
我以前没有使用过void*和const_corrective,所以我不明白我在下面的代码中做错了什么。我只想将const对象的成员函数返回的void*强制转换为int*。请建议更好的方法。多谢各位 我得到以下错误C++ 将常量void*转换为常量int*,c++,casting,const-correctness,C++,Casting,Const Correctness,我以前没有使用过void*和const_corrective,所以我不明白我在下面的代码中做错了什么。我只想将const对象的成员函数返回的void*强制转换为int*。请建议更好的方法。多谢各位 我得到以下错误 passing 'const MyClass' as 'this' argument of 'void* MyClass::getArr()' discards qualifiers 这是我遇到问题的实际程序 class MyClassImpl{ CvMat* arr;
passing 'const MyClass' as 'this' argument of 'void* MyClass::getArr()' discards qualifiers
这是我遇到问题的实际程序
class MyClassImpl{
CvMat* arr;
public:
MyClassImpl(){arr = new CvMat[10];}
CvMat *getArr(){return arr;}
};
class MyClass{
MyClassImpl *d;
public:
const void *getArr()const{ return (void*)d->getArr(); }
};
void print(const MyClass& obj){
const int* ptr = static_cast<const int *>(obj.getArr());
}
int main(){
MyClass obj1;
print(obj1);
}
在本例中,只有“print”等方法知道“getData”返回的数据类型。我不能使用模板,因为用户不知道MyClass是如何实现的。非常感谢。请随意提出备选方案。我认为问题不在于从数组到void*的转换,而在于当obj标记为const且MyClass::getArr不是const成员函数时尝试调用obj.getArr。如果将该成员函数的定义更改为
const void *getArr() const { return static_cast<const void*>(arr); }
那么这个错误应该会自行解决。您可能还需要执行常量重载:
const void *getArr() const { return static_cast<const void*>(arr); }
void *getArr() { return static_cast< void*>(arr); }
我认为问题不在于从数组到void*的转换,而在于当obj标记为const并且MyClass::getArr不是const成员函数时试图调用obj.getArr。如果将该成员函数的定义更改为
const void *getArr() const { return static_cast<const void*>(arr); }
那么这个错误应该会自行解决。您可能还需要执行常量重载:
const void *getArr() const { return static_cast<const void*>(arr); }
void *getArr() { return static_cast< void*>(arr); }
下面是如何将void*转换为int*。。。int*vp;完成。也就是说,你为什么要用C++中的空洞指针来处理这些问题呢?模板我的朋友,模板…谢谢Ed。在这种情况下我如何应用模板?@Ed:是的,明白了。。我正在更改代码。我不知道为什么我没有考虑模板。谢谢这里是你如何把一个空*变成一个整数*。。。int*vp;完成。也就是说,你为什么要用C++中的空洞指针来处理这些问题呢?模板我的朋友,模板…谢谢Ed。在这种情况下我如何应用模板?@Ed:是的,明白了。。我正在更改代码。我不知道为什么我没有考虑模板。谢谢你的工作,但我不想在成员函数上使用const,因为还有其他函数通过'getArr'@user521771更改'arr'。你可以通过使签名无效*getArr const;然而,你真的应该考虑这是否是一个好主意——如果你能改变MyClass的常量,即使它是常量,你实际上是在撒谎。谢谢templatetypedef。是的,设计肯定有问题。另外,你对我如何避免void*@user521771有什么建议吗?这取决于设计,没有更多的信息,我不知道我能帮多少忙。一个问题是,你为什么要在一开始就让演员无效。。。为什么不直接返回int*?我已经在代码中添加了更多内容。让我知道您认为有效的设计有什么问题,但我不想在成员函数上使用const,因为还有其他函数通过'getArr'@user521771'更改'arr'。您可以通过使签名无效*getArr const;然而,你真的应该考虑这是否是一个好主意——如果你能改变MyClass的常量,即使它是常量,你实际上是在撒谎。谢谢templatetypedef。是的,设计肯定有问题。另外,你对我如何避免void*@user521771有什么建议吗?这取决于设计,没有更多的信息,我不知道我能帮多少忙。一个问题是,你为什么要在一开始就让演员无效。。。为什么不直接返回int*?我已经在代码中添加了更多内容。让我知道你认为这个设计有什么问题