2013-11-27 4 views
2

Для школьного проекта я пытаюсь создать двоичное дерево поиска, в то же время мы должны научиться использовать «дружбу» в классах. Ошибки, которые я получаю при компиляции: [Я помещаю комментарии в код, где ошибки исходят из ясности] (Имейте в виду, что мне не разрешено встраивать узел в класс BST, оба они должны быть в отдельных файлах и классах для ради этого задания программирования)Создание нового узла для двоичного дерева поиска

BST.cpp: In member function `void BST::insert(std::string, std::string)': 
BST.cpp:51: error: non-lvalue in assignment 
BST.cpp:58: error: non-lvalue in assignment 
BST.cpp:62: error: non-lvalue in assignment 
makefile.txt:9: recipe for target `BST.o' failed 
make: *** [BST.o] Error 1 

Я попытался с помощью «нового» оператора в BST.cpp и node.cpp, но я до сих пор не могу избавиться от этих сообщений об ошибках. Я считаю, что мне может не хватать нескольких синтаксисов, которые делают компилятор не таким. Вот файлы, используемые в этом задании (Примечание: некоторые функции Арента используется еще с тех пор я не получил, что далеко в проекте.) node.h

#ifndef NODE_H_INCLUDED 
#define NODE_H_INCLUDED 

#include <iostream> 
#include <string> 

using namespace std; 

class BST; 
class Node 
{ 
public: 
    Node(string key, string data) 
    {m_key = key; m_data = data;} 
    ~Node(); 
    static string get_key(); //takes in ptr to node and returns its key 
    static string get_data(); //takes in ptr to node and returns its data 
    static Node* get_left(); //takes in ptr to node and returns its left child pointer 
    static Node* get_right(); //takes in ptr to node and returns its right child pointer 
    static Node* get_parent(); //takjes in ptr to node and returns its parent pointer 
    static Node* create_node(string key, string data); 
    static void destroy_node(); 

private: 
    string m_key; 
    string m_data; 
    Node *m_left; 
    Node *m_right; 
    Node *m_parent; 
}; 


#endif // NODE_H_INCLUDED 

node.cpp

#include "Node.h" 

static string Node::get_key() 
{ 
    return m_key; 
} 
static string Node::get_data() 
{ 
    return m_data; 
} 
static Node* Node::get_left() 
{ 
    return m_left; 
} 
static Node* Node::get_right() 
{ 
    return m_right; 
} 
static Node* Node::get_parent() 
{ 
    return m_parent; 
} 
static Node* Node::create_node(string key, string data) 
{ 
    Node* ptr = new Node(key, data); 
    ptr->m_left = NULL; 
    ptr->m_right = NULL; 
    ptr->m_parent = NULL; 
    return ptr; 
} 

Моего до сих пор целью Node :: create_Node является создание нового узла, Nullify всех указателей и, наконец, передача указателя узла обратно в BST.cpp, чтобы указатели могли быть изменены и вставлены в дерево. Ниже приведены BST.cpp и BST.h (я ставлю комментарии, где ошибки происходят для ясности) BST.h:

#ifndef BST_H_INCLUDED 
#define BST_H_INCLUDED 

#include <iostream> 
#include <string> 

using namespace std; 

class BST 
{ 
public: 
    BST() 
    {m_root = NULL;} 
    ~BST(); 
    void insert(string key, string data); 
    void find(string key); 
    void remove(string key, string data); 
    void print(); 
    friend class Node; 
private: 
    Node* m_root; 

}; 

#endif // BST_H_INCLUDED 

Наконец, BST.cpp (где происходят ошибки) Ошибки происходят при попытке для изменения указателей z (z - указатель на новый узел, который только что был создан), включая его m_left, m_right и m_parent.

#include "BST.h" 
#include "Node.h" 

void BST::insert(string key, string data) 
{ 
    Node* x = m_root; 
    Node* y = NULL; 
    Node* z = Node::create_node(key, data); 
    while(x != NULL) 
    { 
     y = x; 
     if(key < x->get_key()) 
     { 
      x = x->get_left(); 
     } 
     else 
     { 
      x = x->get_right(); 
     } 
    } 
    z->get_parent() = y; //error: non-lvalue in assignment 
    if(y == NULL) 
    { 
     m_root = z; 
    } 
    else if(z->get_key() < y->get_key()) 
    { 
     y->get_left() = z; //error: non-lvalue in assignment 
    } 
    else 
    { 
     y->get_right() = z; //error: non-lvalue in assignment 
    } 
} 
+0

Результат геттера не равен lvalue, вы не можете присвоить ему новое значение. Вместо этого вы должны назначить поле m_left. – flup

+0

функции getter не должны быть статичными, у них нет доступа к объекту, для проблемы с назначением я бы реализовал функции setter и использовал их – Sigroad

ответ

0

Если вы хотите использовать возвращение get_left() и т.д. в качестве мишени для назначения, то вы должны вернуть ссылку.

Однако большая ошибка заключается в том, что по каким-либо причинам вы сделали все эти методы статичными. Это тоже не сработает.

Node*& Node::get_left() 
{ 
    return m_left; 
} 
Node*& Node::get_right() 
{ 
    return m_right; 
} 
Node*& Node::get_parent() 
{ 
    return m_parent; 
} 

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

+0

Я попытался сделать их друзьями, но он все равно никогда не позволит мне получить доступ к приватным члены узла из BST. (это было несколько часов назад, его трудно запомнить). Вот почему я сделал эти вспомогательные функции, вы пытаетесь сказать, что мне не нужны вспомогательные функции в Node.cpp или «#include» Node.h «в BST.cpp? То, что меня достало, у меня мало знаний о наследовании и дружбе. – user3040019

+0

Вы не делаете «своих» друзей, вы делаете класс BST другом класса Node. Все 'friend class BST;' где-то внутри 'class Node {...};' – john

+0

Так что, наоборот, поскольку я пытался использовать 'friend class Node' в другом файле и, похоже, ничего не делал. – user3040019

Смежные вопросы