Перегрузка оператора C ++ указательным объектом - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над сравнением моего объекта с другим объектом того же типа.

Entry<string, string>* name =  new Entry<string, string>(names[9], paths[9]);
Entry<string, string>* name2 = new Entry<string, string>(names[9], paths[9]);

bool isSame = name == name2;

Это всегда ложно.

В моей реализации я попробовал несколько вещей, но безуспешно.

template<class KeyType, class ItemType>
bool Entry<KeyType, ItemType>::operator==(Entry<KeyType, ItemType>* rightHandItem)
{
    KeyType key = rightHandItem->getKey();
    return (searchKey == key);
}

template<class KeyType, class ItemType>
bool Entry<KeyType, ItemType>::operator>(Entry<KeyType, ItemType>* rightHandItem)
{
    KeyType key = rightHandItem->getKey();
    return (searchKey > key);
}
template<class KeyType, class ItemType>
bool Entry<KeyType, ItemType>::operator<(Entry<KeyType, ItemType>* rightHandItem)
{
    KeyType key = rightHandItem->getKey();
    return (searchKey < key);
}

Это мой заголовочный файл класса

#pragma once
template<class KeyType, class ItemType>
class Entry
{
public:
    Entry();
    Entry(KeyType& searchKey);
    Entry(KeyType& searchKey, ItemType newEntry);
    ~Entry();
    ItemType getItem() const;
    KeyType getKey() const;
    void setItem(const ItemType& newEntry);
    bool operator==(const Entry<KeyType, ItemType>& rightHandItem) const;
    bool operator>(const Entry<KeyType, ItemType>& rightHandItem) const;
    bool operator<(const Entry<KeyType, ItemType>& rightHandItem) const;

    bool operator==(Entry<KeyType, ItemType>* rightHandItem);
    bool operator>(Entry<KeyType, ItemType>* rightHandItem);
    bool operator<(Entry<KeyType, ItemType>* rightHandItem);
private:
    ItemType Item;
    KeyType searchKey;
protected:
    void setKey(const KeyType& searchKey);
};

#include "Entry.cpp"

Единственный способ заставить это работать - это объявить запись как объект, а не как указатель.

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

Как сравнить два указателя?

1 Ответ

0 голосов
/ 02 мая 2018
Entry<string, string>* name =  new Entry<string, string>(names[9], paths[9]);
Entry<string, string>* name2 = new Entry<string, string>(names[9], paths[9]);

bool isSame = name == name2;

Это всегда ложь.

Это всегда false, потому что вы сравниваете адреса двух разных объектов. На самом деле, в общем случае с указателем мало что можно сделать, если только вы не поверите. Если вы хотите позвонить Entry::operator==, вам нужно разыменовать указатели, как в:

bool isSame = *name == *name2;

Кстати, возникает вопрос, почему вы вообще используете указатели? Просто используйте простые объекты, и ваша проблема исчезнет:

 auto name =  Entry<string, string>(names[9], paths[9]);
 auto name2 = Entry<string, string>(names[9], paths[9]);

 bool isSame = name == name2;

это будет работать как положено, если вы предоставите Entry::operator==(Entry)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...