Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将常量void*转换为常量int*_C++_Casting_Const Correctness - Fatal编程技术网

C++ 将常量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;

我以前没有使用过void*和const_corrective,所以我不明白我在下面的代码中做错了什么。我只想将const对象的成员函数返回的void*强制转换为int*。请建议更好的方法。多谢各位

我得到以下错误

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*?我已经在代码中添加了更多内容。让我知道你认为这个设计有什么问题