2013-03-14 5 views
2

Просьба пояснить const void * a, const void * b на нижеслегующий код. Являются ли эти постоянные ссылочные параметры, то есть внутренний код этой функции не может изменить ее значение? Зачем делать эти параметры ссылкой? Мысль, что ссылочный параметр предназначен для передачи по значению и позволяет изменять значение внутри определения функции. Зачем использовать void для аргумента параметра?C++ Синтаксис: константный ссылочный параметр

int peak_compare(const void *a, const void *b) //Function peak_compare 
{ 
    Peaks *aa = (Peaks *)a; 
    Peaks *bb = (Peaks *)b; 

    if(aa->wt1 > bb->wt1) return -1; 
    if(aa->wt1 == bb->wt1) return 0; 
    return 1; 
} 

Спасибо за рекомендации.

+0

* "Почему использование 'void' для аргумента параметра?" * - используемый здесь тип фактически является "void *", и я не понимаю этого решения автора этого кода. – LihO

+2

Функция, вероятно, предназначена для использования с алгоритмами C, такими как ['qsort'] (http://en.cppreference.com/w/cpp/algorithm/qsort) и [' bsearch'] (http: // ru. cppreference.com/w/cpp/algorithm/bsearch). –

+1

, а отбрасывания не-созвездий - зло. use 'const Peaks *' – WhozCraig

ответ

2

const typename * p - это синтаксис для Указатель на константу. Это означает, что вы не можете изменить значение в функции.

typename * const p - это синтаксис для Постоянный указатель. Это означает, что вы не можете изменить сам указатель в функции.

В приведенных выше примерах typename может быть любым, от стандартных типов до определенных пользователем типов, до void. Если это void, предполагается, что функция может получить указатели на разные типы. Вы должны правильно привести указатель недействительного для исправления типа для того, чтобы получить доступ к своим членам, как в вашем случае следующие строки делают:

Peaks *aa = (Peaks *)a; 
Peaks *bb = (Peaks *)b; 

Но этот бросок теряет константные-Несса. Правильный синтаксис должен быть:

const Peaks *aa = (const Peaks *)a; 
const Peaks *bb = (const Peaks *)b; 

, чтобы не потерять значение константных-Несс.


EDIT: Как один из комментариев указывают, и поскольку этот вопрос только с тегами C++, бросок лучше сделать в C++ стиль следующим образом:

const Peaks* aa = static_cast<const Peaks*>(a); 
const Peaks* bb = static_cast<const Peaks*>(b); 
+0

Спасибо! хорошо объяснил. – sintiaWeb

+0

добро пожаловать. – meyumer

+0

Для C++ я бы порекомендовал C++-стили: 'const Peaks * aa = static_cast (a);' – Bill

0

const void *a означает, что a является указателем на константу, поэтому содержимое не может быть изменено.
Смотрите эту ссылку для объяснения: http://en.wikipedia.org/wiki/Const-correctness

НО есть опасный бросок после как вы потеряете const содержания с гипсом.

Peaks *aa = (Peaks *)a; 

Должен быть изменен на

const Peaks *aa = (const Peaks *)a; 
-1

Они являются указателями на постоянные данные, правильные, см here, так что вы не можете изменить значение вещи они указывают через указатель.

+0

Спасибо, ссылка была очень информативной и уточнить мой вопрос. – sintiaWeb

+0

Почему голос? – Dutts

0

Сравните два указателя пустоты, возвращая целое число больше, равное или меньшее, чем 0, в зависимости от того, является ли ключ a большим, равным или меньшим, чем ключ b, определяемый путем сравнения их с peak_compare().

+0

Это обобщает общую функцию. Благодаря! – sintiaWeb

+0

Добро пожаловать !!! –

0

Там будет no тип безопасности при использовании аргументов типа void* ли это const или нет. Вы должны избегать использования стилей C-стиля как можно больше.

Peaks* aa = (Peaks*) a; 

может привести к aa быть недействительным, что приведет к непредсказуемому поведению .


В случае, если вам нужна эта функция из-за qsort, то я рекомендую вам использовать std::sort вместо. В этом случае вы можете просто переопределить operator< из Peaks:

struct Peaks 
{ 
    bool operator < (const Peaks& p) const 
    { 
     return (wt1 < p.wt1); 
    } 
}; 

, которые можно было бы возможно использовать так:

std::vector<Peaks> vec; 
... 
std::sort(vec.begin(), vec.end()); 

также посмотреть на Sorting a vector of custom objects :)

Смежные вопросы