2015-04-28 11 views
2

Я просто хочу предисловие к этому, сказав, что я немного новичок во всем этом, поэтому, пожалуйста, несите меня. Поэтому для нашего задания мы должны реализовать свое собственное двоичное дерево поиска. Мы должны использовать этот BST для создания адресной книги объектов типа ExtPersonType (которые имеют разные члены и т. Д.).Извлечение объектов в двоичном дереве поиска

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

Все они очень схожи, поэтому я не буду распространяться со всеми из них. Если кто-то может указать мне в правильном направлении для одного из них, я верю, что смогу понять это. Заранее спасибо за помощь!

Я удалил много кода, чтобы достичь высоких баллов. Дайте мне знать, если вы хотите, чтобы я отправлять больше

BinarySearchTree 
template<class T> 
class BinarySearchTree 
{ 
private: 
    Node<T>* root; 
public: 
    BinarySearchTree() { root = NULL; } 
    void displayInfo(T value); 
    bool search(T value); 

template <class T> 
bool BinarySearchTree<T>::search(T value) 
{ 
    Node<T>* tree = root; 

while (tree) 
{ 
    if (tree->value) 
    { 
     return true; 
    } 
    else if (tree->value > value) 
    { 
     tree = tree->left; 
    } 
    else 
    { 
     tree = tree->right; 
    } 
} 
return false; 
} 

template <class T> 
void BinarySearchTree<T>::displayInfo(T value) 
{ 
Node<T>* tree = root; 

while (tree) 
{ 
    if (tree->value) 
    { 
     cout << tree->value;//I have overloaded << here to display objects (works btw) 
    } 
    else if (tree->value > value) 
    { 
     tree = tree->left; 
    } 
    else 
    { 
     tree = tree->right; 
    } 
    } 
} 

addressbook.cpp.

AddressBook<ExtPersonType> addressBook; 
ExtPersonType person; 

int main() 
{ 
    //reads input from file 
     person.setInfo(firstName, lastName, 
          month, day, year, 
          street, city, state, zipCode, 
          phoneNumber, status); 

     addressBook.insert(person); 
     } 
} 

void optionThree() //The crux of my problem 
{ 
string lastName; 
cout << "Enter the last name of the person: "; 
cin >> lastName; 
addressBook.printInfoOf(lastName); 
} 

addressbook.h

template <class elemType> 
class AddressBook : public BinarySearchTree<elemType> 
{ 
public: 
AddressBook(); 
void printInfoOf(string); 
void printNameInTheMonth(int); 
void printNamesWithStatus(string); 
}; 


// Print - Info Of 
template <class elemType> 
void AddressBook<elemType>::printInfoOf(string lastName) 
{ 
    if(person.getLastName() == (last)) 
    BinarySearchTree::displayInfo(person); 
    else 
    cout << "Not found" << endl; 
} 

Как вы можете видеть, что я понятия не имею, что я делаю. Еще раз, спасибо!

ошибка C2451: условное выражение типа «ExtPersonType» является незаконным Нет оператора определенного пользователя преобразования доступно, который может выполнить это преобразование,> или оператор не может называться документов \ Visual Studio 2010 \ Projects \ programming4 \ binarysearchtree.h (234):> при компиляции шаблона класса член функция 'аннулируются> BinarySearchTree :: displayInfo (T)' с [ T = ExtPersonType ]

+0

Является ли 'ExtPersonType' конвертируемой в' bool'? – phantom

+0

ExtPersonType - это совершенно другой класс, который далее наследует от других классов, таких как AddressType (класс для установки адреса), DateType (класс для установки dob), чтобы по существу сделать «Лицо», которое имеет имя, фамилию, номер телефона, адрес и т. Д. ... – Tacos

+0

Если 'ExtPersonType' не конвертируется в' bool', то почему он используется для оператора if: 'if (tree-> value)' в displayInfo? – phantom

ответ

1

В вашем методе BinarySearchTree::displayInfo вы имеете followin г линия:

else if (tree->value > value) 

Эта линия делает больший, чем сравнение между двумя объектами типа ExtPersonType, но не по умолчанию operator> для пользовательских классов.

Если вы не реализовали что-то вроде

bool operator>(const ExtPersonType & other) const { ... } 

в вашем ExtPersonType классе, то это ваша проблема.

Не забывайте, что если вы реализуете operator>, вы также должны использовать operator<, operator>= и operator<=.

Вообще, следует учитывать operator> и operator<= как родственная пару, и operator< и operator>= в другой смежной пару, и реализовать один из каждой пары, как отрицание других, например:

bool operator>(const ExtPersonType & other) const { 
    return !(*this <= other); 
} 

bool operator<=(const ExtPersonType & other) const { 
    // Do your actual comparison here 
} 

Реализация ваших сравнения таким образом уменьшают ваши шансы на ошибки в будущем, если вам нужно изменить, как два объекта ExtPersonType связаны друг с другом.

+0

Привет, Натан, спасибо за ваш ответ. Я уже это сделал. 'bool operator> (const ExtPersonType right); bool operator <(const ExtPersonType right); \t bool ExtPersonType :: operator <(ExtPersonType bob) { \t \t return (lastName (ExtPersonType боб) { \t \t возврата (LastName> bob.getLastName()); \t} ' – Tacos

+0

Я сделал некоторые предположения о вашем исходном коде, давайте проверим некоторые из них. Эта строка 'binarysearchtree.h: 234'? 'if (tree-> value)'. Если это так, это «значение» объекта или указатель на объект? 'if (tree-> value)' будет работать нормально, если это указатель, но если это объект, вам нужно либо определить сравнение, либо переопределить 'operator bool()' На самом деле, если это строка может быть прочитана 'if (tree-> value == value)'? –

0

Спасибо всем, кто ответил. Натан, вы были правы в том, что проблема заключалась в том, что я не сравнивал значение (значение tree-> value ==). Другая часть была проблемой с тем, как я передавал параметры, но теперь у меня все работает. Благодаря!

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