Претоварване на двоичен оператор › в производен клас в c++

Търсих надлъж и шир за конкретен отговор на този въпрос и не мога да го намеря. Опитвам се да създам базов клас с виртуален оператор>, който мога да отменя в производния клас. В момента имам проблеми, защото декларирането на функцията изисква само една входна променлива (както в "bool operator> (Derived & a)", но опитът да я дефинирам в cpp файл ми казва, че изисква два входа (както в "bool operator > (Производно & a, Производно & b))

Опитах да дефинирам оператора в линия, но след това получавам грешки, при които смята, че производният клас е все още абстрактен, защото предавам производния тип на оператора, както е показано по-горе, вместо на основния клас. Но ако предам базовия клас, тогава нямам достъп до производните членски променливи, които са ми необходими, за да направя сравнението.

Мисля, че пропускам нещо просто тук, но не мога да разбера какво е то.

Надяваме се, че можете да помогнете. Благодаря


person user1971357    schedule 11.01.2013    source източник
comment
Вие ли го определихте като bool Derived::operator>(Derived &a) ...?   -  person Nate Kohl    schedule 12.01.2013
comment
Операторът за виртуално сравнение е малко труден за разсъждение. Как искате да сравните два обекта, които имат различни типове?   -  person Kerrek SB    schedule 12.01.2013
comment
Искам да сравня обекти, които имат едни и същи типове, но няма да знам кой тип влиза. Бих искал да позволя на всеки тип да посочи свой собствен оператор за сравнение, така че който и да се сравнява, да може да се получи правилно сравнение.   -  person user1971357    schedule 12.01.2013


Отговори (3)


За да работят виртуалните повиквания от референция/указател на основата, ще трябва да използвате основния тип във функцията, така че напр.

class Derived : public Base
{
    .... 
    bool operator>(Base &a)
    {
         Derived *pa = dynamic_cast<Derived *>(&a);
         return this->something > pa->something;   // Or whatever... 
    }

   .... 
};

Ако промените типа, той става различна функция и когато използвате базовия указател или препратка, за да се обърнете към operator>, той ще използва този в базовия клас.

person Mats Petersson    schedule 11.01.2013
comment
reinterpret_cast тук? Хайде, това е случаят на използване на dynamic_cast! - person Matteo Italia; 12.01.2013
comment
Няма ли все пак аргументът от лявата страна на › да бъде база? Имам нужда и от двете да бъдат извлечени. - person user1971357; 12.01.2013

Защо не оставите operator>() невиртуален и го накарате да извика частна виртуална функция?

Така:

class Base {
public:
    bool operator>(Base &a) {
        return implementingFunction(a);
    }

private:
    virtual bool implementingFunction(Base &a) = 0;
};
person lethal-guitar    schedule 11.01.2013
comment
И това решава кой точно проблем? Все пак ще трябва да имате същия подпис и да направите някакъв вид преобразуване между базовия и производния клас вътре в имплементацията. Ако направим обща функция от тип compare(a, b), която връща -1, 0, +1 (или нещо подобно) за по-малко от, равно и повече от, тогава това има смисъл. Но ако просто искаме функцията по-малко от, тогава наистина не виждам смисъл [но може би пропускам нещо тук]. - person Mats Petersson; 12.01.2013

person    schedule
comment
Сблъсквам се с проблем, при който фактът, че базовият оператор взема основен обект, докато извлеченият оператор взема производен обект, получавам грешки на компилатора, когато се опитвам да извикам функцията (предавайки указател към база), която изглежда е причина по наследство, която всъщност не се среща. Вашият код предполага, че наличието на различни входни аргументи няма да е проблем, така че имате ли представа защо това може да се случва? - person user1971357; 12.01.2013