Изменить значение элемента данных объекта с помощью указателя на этот объект - PullRequest
0 голосов
/ 18 января 2019

Я могу изменить значение pTest баллов на *pTest = 100;:

int main() {
    int *pTest = new int;
    *pTest = 100;
    cout << " Value of pTest " << *pTest;
}

Но я не могу изменить элемент данных этого объекта с помощью *pCurrPtr->m_Data = 1;:

class CNode {
public:
    int m_Data;
    CNode *m_pLinkedList;
};

int main() {
    CNode *pHeadPtr, *pCurrPtr, *pTailPtr, *pDeleteThisNode;
    pCurrPtr = new CNode;
    pCurrPtr->m_Data = 1;//won't compile with *pCurrPtr->m_Data = 1;

    cout << "data is " << pCurrPtr->m_Data;
}

Почему это так?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Это синтаксис C ++.

pCurrPtr->m_Data эквивалентно (*pCurrPtr).m_Data:

  • разыменование pCurrPtr (которое является указателем на CNode),
  • и доступ к переменной m_Data члена (типа int) этого объекта.

=> Все хорошо.

*pCurrPtr->m_Data эквивалентно *(pCurrPtr->m_Data) и *((*pCurrPtr).m_Data):

  • разыменование pCurrPtr (которое является указателем на CNode),
  • доступ к переменной m_Data члена (тип int) этого объекта,
  • ... чтобы разыменовать его.

=> Но m_Data - это не указатель на int, это , это и int. И это должно быть то, на что жалуется ваш компилятор.

0 голосов
/ 18 января 2019

Когда вы используете *pCurrPtr->m_Data, оно равно *(pCurrPtr->m_Data), что означает, что вы пытаетесь разыменовать элемент m_Data. И m_Data не является указателем и поэтому не может быть разыменован.

Если вы хотите разыменовать (фактический) указатель pCurrPtr, это уже сделано с помощью оператора «стрелка» ->: pCurrPtr->m_Data равно (*pCurrPtr).m_Data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...