Bit87 Ответов: 1

Как передать и вернуть структуру из функции в main из заголовочного файла


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

Проблема здесь в том, что я не понимаю, как вызвать функцию, которая возвращает из нее структуру, я пробовал некоторые вещи, но ничего не получалось.

Выход

error: request for member 'Insert' in 'root', which is of pointer type 'TREE::tree*' (maybe you meant to use '->' ?)
   root = root.Insert(root, 9);


error: request for member 'Print' in 'root', which is of pointer type 'TREE::tree*' (maybe you meant to use '->' ?)
  root.Print(root);



Заголовочный файл

#ifndef _LibArb_H_
#define _LibArb_H_

struct Node{
	
	int val;
	Node *left, *right;
	
};

using namespace std;
namespace TREE
{

class tree
{

	private:
	
		Node *node;
		
	public:
	
		tree();
		~tree();
		
Node* Insert(Node *node, int val) // Returns a struct
{
	if(node == NULL) // If no nodes then create a new one
	{
		node = new Node;
		node->val = val;
		node->right = node->left = NULL;
	}	
	
	else if(node->val > val)
		node->left = Insert(node->left, val); // Insert value on the left node
	else
		node->right = Insert(node->right, val); // Insert value on the right node
	
	return node; // Return the value of node
}

void Print(Node *node)
{
	
	if (node)
	{
		cout << "Val: " << node->val << endl;
		cout << "Left: " << node->left << endl;
		cout << "Right: " << node->right << endl;
		Print(node->left);
		Print(node->right);
	}
}
};
}

# endif // _LibArb_H_


#include <iostream>
#include "LibArb.h"

using namespace std;
using namespace TREE; // From the header file

int main()
{

	tree *root = NULL; // Create new root from the class tree of the header file
	
		root = root.Insert(root, 9); // New node with the number 9 on it
	
	root.Print(root); // Print all the nodes from the tree

	
	return 0;
}


Что я уже пробовал:

root = root - & gt;Insert(root, 9); Fail
Insert (root, 9); Fail

1 Ответов

Рейтинг:
12

Richard MacCutchan

tree *root = NULL; // Create new root from the class tree of the header file

root = root.Insert(root, 9); // New node with the number 9 on it

Первый оператор создает указатель и устанавливает его в NULL, поэтому он ни на что не указывает. Затем вы попытаетесь позвонить в Insert метод на нулевом указателе, который всегда будет терпеть неудачу. Вам нужно инициализировать root и тогда вы можете использовать его, но путем -> ссылка, а не точка; таким образом,:
tree *root = new tree(); // Create new tree pointer
// and as root is a pointer we need to use the -> reference type
root = root->Insert(root, 9); // New node with the number 9 on it

Однако, поскольку ваш код стоит, это теперь перезапишет корневой указатель, так что он будет потерян. Я подозреваю, что метод вставки нуждается в некоторой работе, или node переменная в классе дерева должна быть общедоступной.
tree *root = new tree(); // Create new tree pointer
// and as root is a pointer we need to use the -> reference type
root->node = root->Insert(root, 9); // New node with the number 9 on it



Вы также должны удалить реализацию ваших классов из заголовочного файла и оставить только объявления.


CPallini

5.

Bit87

Спасибо за объяснение и за ваше время, в конце концов мне пришлось внести некоторые изменения, но теперь это работает.

корень-&ГТ;узел = корень-&ГТ;вкладыш(корень-и GT;узел, 9); // это конечный результат