Это прямое объявление
class Node;
является избыточным и не совпадает с объявлением класса-члена Node в определении класса Set.
class Node;
class Set{
public:
Set();
Set(int x);
void find(int x);
void insert(int x);
Node* findSmallest(Node* node);
private:
class Node {
//...
Так что на самом деле вы объявлены два класса Node. Один в глобальном пространстве имен, а другой - как член класса Set.
В определении класса Set узел Node ссылается на узел члена класса в этих объявлениях
Node *smallerNode;
Node *greaterNode;
Однако вне например, определение класса в этом объявлении
Node* Set::findSmallest(Node* node){
//..
имя узла перед декларатором findSmallest(Node* node)
относится к имени, объявленному в глобальном пространстве имен. С другой стороны, имя Node, используемое в объявителе в качестве типа параметра, относится к имени Node, объявленному в классе Set scope.
Просто удалите прямое объявление
class Node;
Это не используемый.
Вам необходимо определить класс Node, прежде чем ссылаться на него. Поэтому переформатируйте определение класса следующим образом
class Set{
private:
class Node {
public:
int value;
Node *smallerNode;
Node *greaterNode;
Node();
Node(int x);
};
Node* rootNode;
Node* nextNode;
public:
typedef class Node Node;
Set();
Set(int x);
void find(int x);
void insert(int x);
static Node* findSmallest(Node* node);
};
Обратите внимание на то, что поскольку функция findSmallest принимает в качестве аргумента указатель на узел, тогда она должна быть объявлена как функция-член stati c. В этом случае он может быть определен следующим образом
Set::Node* Set::findSmallest( Node *node )
{
if ( node != nullptr )
{
while ( node->smallerNode ) node = node->smallerNode;
}
return node;
}
В противном случае в определении класса он должен быть объявлен как
Node* findSmallest() const;
и определен вне класса как
Set::Node* Set::findSmallest() const
{
Node *node = rootNode;
if ( node != nullptr )
{
while ( node->smallerNode ) node = node->smallerNode;
}
return node;
}
Также обратите внимание на то, что этот конструктор
Set::Set(int x){
rootNode->value = x;
nextNode = nullptr;
}
имеет неопределенное поведение, так как указатель rootNode не был инициализирован.
И элемент данных
Node* nextNode;
является избыточны и должны быть удалены. Он используется в качестве локальной вспомогательной переменной в некоторых функциях-членах. Таким образом, такая переменная должна быть определена в этих функциях.
Функция find не должна выводить никаких сообщений. Вызывающая функция решает, выводить ли сообщение. Функция должна иметь возвращаемый тип bool и быть объявлена как постоянная функция-член.
Например,
bool find(int x) const;
Определение функции вне класса может выглядеть следующим образом
bool Set::find( int x ) const
{
Node *node = rootNode;
while ( node != nullptr && node->value != x )
{
if ( x < node->value ) node = node->smallerNode;
else node = node->greaterNode;
}
return node != nullptr;
}