Можно ли определить функцию вне класса, используя закрытый тип возврата в C ++? - PullRequest
0 голосов
/ 24 марта 2020

Итак, я работаю через класс структур данных C ++ в моем университете, и как часть руководства по стилю, все функции-члены класса, длина которых превышает 10 строк кода, должны быть определены вне класса.

В настоящее время мы строим дерево двоичного поиска, и я столкнулся с ситуацией, когда мне нужно определить функцию вне класса, потому что она слишком длинная. Вот его общая форма с соответствующей информацией:

Определение текущего класса

template<typename T>
class BST {
private:
    struct Node {
        T data;
        Node* rightChild;
        Node* leftChild;
    }

    Node* searchNode(Node* node, const T& data) const {
        //Function definition, somewhat long
    }

public:
    //Other member functions
}

Так что я хотел бы объявить эту функцию только в объявлении класса а затем определите его в другом месте в отдельном cpp файле, например:

Предложенная часть BST.h

template<typename T>
class BST {
private:
    struct Node {
        T data;
        Node* rightChild;
        Node* leftChild;
    }

    Node* searchNode(Node*, const T&) const;

public:
    //Other member functions
}

Предложенная BST. cpp Часть

#include "BST.h"

template<typename T>
Node* BST<T>::searchNode(Node* node, const T& data) const {
    //Function Declaration, somewhat long
}

Однако мой компилятор больше не распознает тип Node, потому что я сейчас вне своего класса. Есть ли способ обойти это приятно? Или мне просто придется жить с этим, определенным в объявлении моего класса?

Спасибо за ваше время!

1 Ответ

1 голос
/ 24 марта 2020

Это возможно. Поскольку возвращаемый тип приходит перед именем функции --- поэтому компилятор еще не знает, что вы определяете член BST<T> ---, вы должны специально указать ему, что Node является членом этого класса. Вы должны использовать квалифицированное имя:

template<typename T>
typename BST<T>::Node* BST<T>::searchNode(Node* node, const T& data) const {
    //Function Declaration, somewhat long
}

(В C ++ 20 typename может быть опущено .)

Вы можно также использовать конечный тип возврата, чтобы избежать дополнительной квалификации:

template<typename T>
auto BST<T>::searchNode(Node* node, const T& data) const -> Node* {
    //Function Declaration, somewhat long
}

Здесь, поскольку компилятор уже видел, что функция является членом BST<T>, он будет искать Node* в этом класс.

Тот факт, что Node является частным, здесь не имеет значения. Личное имя Node «используется» определением функции-члена, которое является частью класса, поэтому доступ разрешен.

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