2013-08-13 3 views
0

Я пытаюсь создать набор, который может быть заполнен экземплярами класса. Я думал, что требование для набора состоит в том, что элементы можно сравнивать, и поэтому в этом случае мне нужно рассказать классу, как их можно сравнивать. Я создал следующий класс:Создание набора классов

class Myclass 
    { 
    public: 
    Myclass(int i):storedval(i) {} 
    int getval(){return storedval;} 

    friend bool operator> (Myclass &first, Myclass &second) 
     { 
     return first.getval()>second.getval(); 
     } 
    friend bool operator< (Myclass &first, Myclass &second) 
     { 
     return first.getval()<second.getval(); 
     } 

    private: 
    int storedval; 
    }; 

Но когда я пытаюсь добавить экземпляры к набору, как это:

Myclass a(50); 
set<Myclass> Bunchofclasses; 
Bunchofclasses.insert(a); 

Это дает мне кучу текста ошибки, что я думаю, что говорит мне, что это не понимают операторы> и <. Как это должно быть сделано правильно?

+2

Было бы полезно, если бы вы могли добавить ошибки. – DrYap

+1

Кстати, поскольку операторы сравнения используют публичную функцию 'getval', им действительно не нужно дружить с классом. –

+0

Сообщение juanchopanza уже помогло мне, но я приклеил ошибки здесь: http: //shrib.com/VNGKgtoQ – RobVerheyen

ответ

4

Вам необходимо пройти const ссылки на функцию сравнения, потому что это не должно быть позволено изменять элементы сравниваемых:

friend bool operator< (const Myclass& first, const Myclass& second) 
{ //     ^^^^^     ^^^^^ 
    return first.getval() < second.getval(); 
} 

Это потребует, чтобы вы сделать getVal()const, а также. Это делает его отозваны на const экземпляров или через const ссылок:

int getval() const {return storedval;} 
//   ^^^^^ 

Обратите внимание, что вам не нужно operator> для набора на работу. Меньше, чем достаточно.

Строго говоря, здесь вам не нужна функция friend, так как вы вызываете функции-члены public. Единственное, что приносит здесь friend, - это позволить вам объявить не членную функцию внутри определения класса.

+0

Является ли «friend bool operator <(const Myclass & first, const Myclass & second) {...}" legal C++? –

+0

@ DieterLücking Да, это так. – juanchopanza

3

Элементы набора неизменяемы, поэтому набор должен иметь возможность сравнивать значения const. Таким образом, сравнение должно быть:

friend bool operator< (Myclass const &first, Myclass const &second) 
//        ^^^^^     ^^^^^ 

(Вы, вероятно, следует также сделать это с operator> и любых других не мутирует операций, которые обеспечивают, но set нужно только operator<).

Кроме того, для того, чтобы получить доступ к значению const объекта, сбруя также должна быть const:

int getval() const 
//   ^^^^^ 
Смежные вопросы