Как передать постоянный указатель на метод в классе - PullRequest
1 голос
/ 19 марта 2012

У меня есть конструктор класса Node:

Node::Node(int item,  Node const * next)
{
    this->item = item;
    this->next = next;
}

При компиляции выдается ошибка компиляции: неверное преобразование из 'const Node *' в 'Node *'

Есть ли способ передать указатель, указывающий на постоянные данные?

Ответы [ 3 ]

7 голосов
/ 19 марта 2012

Вы делаете это правильно, но компилятор вправе жаловаться: вы назначаете «указатель на const Node» на переменную с типом «указатель на неконстантный Node»,Если позже вы измените this->next, вы нарушаете контракт: «Я не буду изменять переменную, на которую указывает next.

Простое исправление - просто объявить next как указатель на не-const data. Если переменная this->next действительно никогда не будет изменена в течение срока службы объекта Node, то вы можете альтернативно объявить член класса указателем на const объект:

class Node
{
    ...
    const Node *next;
}:

Также обратите внимание на различие между «указателем на const данные» и «const указателем на данные». Для одноуровневых указателей существует 4 типа указателей в отношении их const сущности:

Node *ptr;  // Non-constant pointer to non-constant data
Node *const ptr;  // Constant pointer to non-constant data
const Node *ptr;  // Non-constant pointer to constant data
Node const *ptr;  // Same as above
const Node *const ptr;  // Constant pointer to constant data
Node const *const ptr;  // Same as above

Обратите внимание, что const Node - это то же самое, что и Node const на последнем уровне, но размещение const относительно объявления указателя ("*") очень важно.

0 голосов
/ 19 марта 2012
It also works with pointers but one has to be careful where ‘const’ is put as that determines whether the pointer or what it points to is constant. For example,

    const int * Constant2
declares that Constant2 is a variable pointer to a constant integer and

    int const * Constant2
is an alternative syntax which does the same, whereas

    int * const Constant3
declares that Constant3 is constant pointer to a variable integer and

    int const * const Constant4
declares that Constant4 is constant pointer to a constant integer. Basically ‘const’ applies to whatever is on its immediate left (other than if there is nothing there in which case it applies to whatever is its immediate right).

http://duramecho.com/ComputerInformation/WhyHowCppConst.html Я думаю, что эта ссылка поможет вам. Вам нужно знать, что означает const. Удачи.

0 голосов
/ 19 марта 2012

Есть ли способ передать указатель, указывающий на постоянные данные?

Да. Используйте Node const* (или const Node*), как показано в коде.

Чтобы исправить ошибку компилятора, у вас есть 3 варианта:

  1. Node::Node() должен получить неконстантный указатель, чтобы его можно присвоить this->next
  2. Измените дизайн и объявите Node::next также Node const*
  3. Typecast, this->next = const_cast<Node*>(next);

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

...