2014-02-17 4 views
0

У меня проблема, у меня есть этот класс, который теперь работает, потому что у меня есть атрибут публично, но если я помещаю его в приватный или защищенный и унаследованный ко второму классу, он не работает, как можно я делаю это?Наследование класса или вложенный класс, что лучше?

template <typename T> 
class BinaryNode 
{ 
public: 
    T key; 
    BinaryNode<T>* left; 
    BinaryNode<T>* right; 
    BinaryNode<T>* parent; 
    BinaryNode(){} 
    ~BinaryNode(){} 
}; 

И это:

template <typename T> 
class BinarySearchTree 
{ 
private: 
    BinaryNode<T>* root; 
    BinaryNode<T>* newNode(T key); 

    BinaryNode<T>* minimum(BinaryNode<T>* node); 
    BinaryNode<T>* maximum(BinaryNode<T>* node); 
    BinaryNode<T>* successor(BinaryNode<T>* node); 

    void insert(BinaryNode<T>** node, T key); 
    BinaryNode<T>* search(BinaryNode<T>* node, T key); 
    void distance(BinaryNode<T>* node, T key); 
    void inorderTreeWalk(BinaryNode<T>* node); 
public: 
    BinarySearchTree(); 
    ~BinarySearchTree(); 

    void insert(T key); 
    BinaryNode<T>* search(T key); 
    void distance(T key); 
    void inorderTreeWalk(); 

    BinaryNode<T>* remove(BinaryNode<T>* node); 
}; 
+1

Я не уверен, что вы просите. Но, возможно, «BinaryNode» должен быть «другом» BinarySearchTree? Или вам нужно иметь «публичные» аксессоры к вашим «частным»/«защищенным» данным в «BinaryNode». В противном случае, как вы ожидали, что 'BinarySearchTree' получит доступ к свойствам? – Matt

+0

Универсальных решений нет. Пожалуйста, добавьте информацию о [Что вы пробовали до сих пор] (http://mattgemmell.com/what-have-you-tried/), как именно «это не работает» * для вас *, и предоставить [SSCCE] (http://sscce.org/) (не копирование пасты всего кода). Без этой информации мы едва можем вам помочь. – Drop

+0

https://www.dropbox.com/s/s8xsn3q01ysyy4f/classi.h Это файл заголовка со всеми, как я могу выполнять все атрибуты BinaryNode в закрытом или вложенном классе в binarysearchtree? – Raid3nz

ответ

0

Похоже узел тесно связан с деревом:

Вы можете сделать дерево друга узла или использовать вложенный класс:

class Node { 
    private: 
    friend class Tree; 
    ... 
}; 

class Tree { 
    ... 
}; 

или

class Tree { 
    private: // maybe protected 
    class Node { 
     public: 
     ... 
    }; 
}; 
+0

dropbox.com/s/s8xsn3q01ysyy4f/classi.h Это файл заголовка со всеми, как я могу выполнять все атрибуты BinaryNode в закрытом или вложенном классе в binarysearchtree? – Raid3nz

0

Вы можете сделать доступными функции «getter» для узлов, чтобы вы могли перемещаться по дереву в своем двоичном дереве поиска.

template <typename T> 
class BinaryNode 
{ 
private: 
    T key; 
    BinaryNode<T>* left; 
    BinaryNode<T>* right; 
    BinaryNode<T>* parent; 
public: 
    BinaryNode(){} 
    ~BinaryNode(){} 

    T const& getKey() const { return key; } 
    const BinaryNode<T>* getLeft() const { return left; } 
    const BinaryNode<T>* getRight() const { return right; } 
    const BinaryNode<T>* getParent() const { return parent; } 
}; 

Теперь BinarySearchTree<T> может пройти через дерево, чтобы сделать поиск, не имея прямой доступ к членам или возможности изменять их.

Конечно, вы, вероятно, захотите также некоторых методов изменить значение (установить функции)

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