Приведение const void * к const int * - PullRequest
1 голос
/ 19 января 2011

Я раньше не использовал void * и const_c корректность, поэтому я не понимаю, что я делаю неправильно в приведенном ниже коде Все, что я хочу, это привести void *, возвращенный функцией-членом объекта const, к 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. Спасибо. Не стесняйтесь предлагать альтернативы.

1 Ответ

5 голосов
/ 19 января 2011

Я думаю, что проблема не в приведении вашего массива к void *, а в попытке вызвать obj.getArr(), когда obj помечено const и MyClass::getArr() не является const функцией-членом.Если вы измените определение этой функции-члена на

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

, то эта ошибка должна разрешиться сама собой.Возможно, вы также захотите сделать const-перегрузку:

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