Объявление структуры в классе, в многофайловом проекте

У меня есть изначально работающий код моего класса :

class Dictionary {
    struct node {
        map<string, string> data;
        node* left;
        node* right;
    };

    node* root;

    node* find(node* t, string search_word) {
       //код ф-ии
    }
}

Мне необходимо разделить реализацию и объявление через Header.h и Header.cpp. Как и где мне надо объявлять и описывать структуру node? Если в .h пишу :

class Dictionary {
    struct node {
      //код структуры
    };
    node* root;
    node* find(node* t, string search_word);
}

А в .cpp :

Dictionary::find(node* t, string search_word)
{
  //код ф-ии
}

В cpp выдает ошибки : идентификатор "node" не определен. А так же ,что объявление несовместимо с .h


Ответы (1 шт):

Автор решения: HolyBlackCat

В .cpp-файле нужно указывать возвращаемые типы функций. И именно в возвращаемых типах (и только в них, не в параметрах), вместо node надо писать Dictionary::node.

Так как возвращаемый тип пишется слева от имени класса, которому принадлежит метод, компилятор еще не знает, что node надо искать внутри Dictionary.

Альтернатива: использовать синтаксис trailing return type. Так как в этом случае возвращаемый тип справа от имени класса, там можно писать просто node.

Т.е. на выбор либо:

  • Dictionary::node* Dictionary::find(node* t, string search_word) {...} - классический синтаксис
  • auto Dictionary::find(node* t, string search_word) -> node* {...} - trailing return type

Также, возможно у вас получится спрятать и саму структуру node в .cpp-файл. Это возможно, если методы класса не принимают и не возвращают ее по значению, и она не хранится по значению в самом классе. (По указателю, как у вас в примере - можно.)

Для этого в хедере вместо нее надо оставить struct node; без тела, а в .cpp определить ее как struct Dictionary::node {...};.

→ Ссылка