Функция-член класса не может получить доступ к закрытому узлу структуры того же класса? - PullRequest
1 голос
/ 20 января 2020

Я работал над домашним заданием и наткнулся на блокпост

Я создал класс связанного списка, который выглядит примерно так

List.h
class List{
   struct Node{
       string data
       etc...
   }

   public:
       Node* lastNode(Node* root);
  List.cpp

  #include "List.h"

  List::Node* lastNode(Node* root){
      while(root && root->next){
          root = root->next;
      }
      return root;
  }

Когда я пытаюсь запустить код, он говорит "struct List :: Node is private" в этом контексте (начиная с заголовка функции для lastNode в List. cpp)

Я не понимаю, что является причиной этого. Я знаю, что частные поля могут быть доступны только для функций-членов одного класса, но не является ли lastNode функцией-членом?

1 Ответ

0 голосов
/ 20 января 2020
List::Node* lastNode(Node* root) { ... }

определяет глобальную функцию с именем lastNode, возвращающую List::Node*. Вы хотели определить это как член функция List. Чтобы сделать это, вы просто квалифицируете имя lastNode как List::.

List::Node *List::lastNode(Node *root) { ... } // * placement is more idiomatic this way

Второй List:: в имени функции объявляет, что эта функция "принадлежит" к List, поэтому второй Node, следующий за ним, не нуждается в повторном уточнении List::. Тип возвращаемого значения, поскольку он предшествует List:: на последнем узле, все еще интерпретируется в глобальной области видимости, и поэтому его необходимо квалифицировать. Я не думаю, что для этого есть какая-либо веская причина, кроме исторической инерции, пережитка того времени, когда компиляторы были настолько глупы, чтобы запутаться в этом. Вы также можете поместить тип возврата после квалифицированного имени функции, где вы можете опустить квалификатор:

auto List::lastNode(Node *root) -> Node* { ... }

Godbolt

...