2013-11-26 3 views
0

Я считаю, что моя перегрузка оператора не работает ни для одного из моих двух типов данных. Моя программа работает с типом данных int, но не с моими определенными учениками классов. студенты - это дерево указателей, так что это может быть моей проблемой. Я обнаружил эту проблему, когда функция поиска не функционировала так, как планировалось. Я надеюсь получить совет относительно того, что я делаю неправильно с моими перегруженными операторами.Перегрузка оператора двоичным деревом поиска

struct Students{ 

char lastName[20]; 
char firstName[20]; 
int IDnumber; 
Students(); 
bool operator == (const Students); 
bool operator > (const Students); 
bool operator < (const Students); 

friend ostream& operator << (ostream& stream, const Students* students); 

}; 

template <class DataType> 
TNode<DataType>* BST<DataType>::bstSearch(DataType search) 
{ 
TNode<DataType>* y = root; 

    while (y!=NULL && search != y->data) 
    { 
     if (search < y->data) 
    { 
     y = y->left; 
    } 
     else 
    { 
     y = y->right; 
     } 
    } 

    return y; 
} 

вот мой overloader код

friend bool operator == (const Students& lh, const Students& rh); 
friend bool operator > (const Students& lh, const Students& rh); 
friend bool operator < (const Students& lh, const Students& rh); 

bool operator ==(const Students& lh, const Students& rh) 
{ 
    return lh.IDnumber == rh.IDnumber; 
} 

bool operator > (const Students& lh, const Students& rh) 
{ 
    return lh.IDnumber > rh.IDnumber; 
} 

bool operator < (const Students& lh, const Students& rh) 
{ 
    return lh.IDnumber < rh.IDnumber; 
} 

это объекты дерева я создаю

BST<Students*> stree;    
    BST<int> itree; 
+0

Я немного поправился от перегрузки вашего оператора –

ответ

2

Если вы используете Students* для типа данных, то это:

if (search < y->data) 

is compa кольцевые указатели, а не фактические объекты. Передайте объект Student по значению BST:

BST<Students> stree;    

Кроме того, не передать объект по значению к операторам и поисковой функции:

bool Students::operator< (const Students& ob) 
TNode<DataType>* BST<DataType>::bstSearch(const DataType& search) 

Следующая вещь, которую следует иметь в виду, что вы не» t необходимо реализовать все операции сравнения по отдельности, достаточно реализовать только operator<. Например:

bool operator==(const some_class& b){ return !(*this < b) && !(b < *this); } 
bool operator>(const some_class& b){ return !(*this == b) && !(*this < b); } 
// and so on... 

С другой стороны, вы можете использовать шаблоны, std::enable_if и std::is_pointer разыменовать вы указатель автоматически:

#include <utility> 
#include <iostream> 

template<typename T> 
T& dereference(T &v){return v;} 

template<typename T> 
const T& dereference(const T& v){return v;} 

template<typename T> 
typename std::enable_if<!std::is_pointer<T>::value, T&>::type dereference(T* v){return dereference(*v);} 

// example usage: 
template <typename T> 
class A 
{ 
public: 
     bool compare(T a, T b){ 
       return dereference(a) < dereference(b); 
     } 


}; 

int main() 
{ 

     int u = 10; 
     int *v = &u; 

     int i = 5; 
     int *j = &i; 


     A<int> a; 
     A<int*> b; 

     std::cout << a.compare(i, u) << std::endl; 
     std::cout << b.compare(j, v) << std::endl; 

     return 0; 

} 

Так, просто добавьте dereference шаблоны, и в вашей search функции вы можете используйте его как:

template <class DataType> 
TNode<DataType>* BST<DataType>::bstSearch(DataType search) 
{ 
TNode<DataType>* y = root; 

    while (y!=NULL && dereference(search) != dereference(y->data)) 
    { 
     if (dereference(search) < dereference(y->data)) 
    { 
     y = y->left; 
    } 
     else 
    { 
     y = y->right; 
     } 
    } 

    return y; 
} 

Подробнее о методе разыменования см. в разделе «Отличные ответы на мои вопросы» вопрос здесь: Recursively dereference pointer

+0

Есть ли способ изменить мой код перегрузки, чтобы исправить это, не меняя BST, чтобы передать не указатель? например, если я сменил операторов на прием bool Students :: operator <(const Students * ob), будет ли это работать? – user2105982

+0

@ user2105982 См. Мое редактирование для некоторых идей. Этот код использует C++ 11. –

0

Если вы хотите сохранить это дерево указателей, вы хотите сравнить, как это:

if (*search < *(y->data)) { 

Как я вижу это, int тип не-указатель, и Students* является типа указателя.
Если вы используете Students вместо Students* в своем дереве, он должен работать.
В качестве альтернативы вы можете выполнить другую реализацию для обработки деревьев указателей.

+0

Но это не удастся для 'BST '. –

+0

Я добавил свой код для моей студенческой структуры, чтобы уточнить. – user2105982

+0

А, я думаю, мои проблемы были связаны с пониманием того, что такое «Тенод». –

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