将 const void* 转换为 const int*

Posted

技术标签:

【中文标题】将 const void* 转换为 const int*【英文标题】:Casting const void* to const int* 【发布时间】:2011-01-19 00:15:08 【问题描述】:

我之前没有使用过 void* 和 const_correctness,所以我不明白我在下面的代码中做错了什么。我想要的只是将 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* 转换为 int*... (int*)vp;完毕。也就是说,你为什么要在 C++ 中使用像这样的 void* 指针呢?模板我的朋友,模板... 谢谢埃德。在这种情况下如何应用模板? @Ed:是的,明白了.. 我正在更改我的代码。我不知道为什么我没有考虑模板。谢谢 【参考方案1】:

我认为问题不在于从您的数组转换为void *,而是在obj 标记为const 并且MyClass::getArr() 不是const 成员函数时尝试调用obj.getArr()。如果您将该成员函数的定义更改为

 const void *getArr() const  return static_cast<const void*>(arr); 

那么这个错误应该会自行解决。您可能还想做一个 const-overload:

 const void *getArr() const  return static_cast<const void*>(arr); 
       void *getArr()        return static_cast<      void*>(arr); 

【讨论】:

这行得通,但我不想在成员函数上使用 const,因为还有其他函数可以通过 'getArr' 更改 'arr' @user521771- 你可以通过签名void* getArr() const; 来做到这一点但是,你真的应该考虑这是否是一个好主意——你实际上是在撒谎MyClass 如果即使它是 const,你也可以对其进行变异。 感谢 templatetypedef。是的,设计肯定有问题。你对如何避免 void* 有什么建议吗? @user521771- 这真的取决于设计,如果没有更多信息,我不知道我能提供多少帮助。一个问题是,为什么你首先要对void* 进行演员表...为什么不直接交回int* 我在代码中添加了更多内容。让我知道您认为设计有什么问题

以上是关于将 const void* 转换为 const int*的主要内容,如果未能解决你的问题,请参考以下文章

如何将 const void* 强制转换为结构元素?

void Test::printxy(void)' : 不能在 const 类中将 'this' 指针从 'const Test' 转换为 'Test &'

C++ const void* 转换

将 const T* const 转换为 T*

qsort 给出 [错误]:从 `int (*)(cricketer*, cricketer*)' 到 `int (*)(const void*, const void*)' 的无效转换

C++ 将 char 转换为 const char*