Объявление структуры в классе, в многофайловом проекте
У меня есть изначально работающий код моего класса :
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 шт):
В .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 {...};.