перегрузка операторов c ++ - PullRequest
       10

перегрузка операторов c ++

1 голос
/ 23 сентября 2010

Я новый программист в C ++

и у меня есть абстрактный класс A, и я реализовал в нем операторы.

и теперь у меня есть два класса B и C, которые расширяют A.

по какой-то причине компилятор не идентифицирует операторы.

это потому что операторы не наследуются? или это потому, что у меня ошибка кода?

вот код:

#ifndef A_
#define A_

class A{
public:

    friend bool operator==(const A &a1,const A &a2);
}
#endif

inline bool operator==(const A& a1, const A& a2){

....

}

Разве это не должно работать на B == C и B == B и C == C? спасибо

Мэтт

Ответы [ 4 ]

2 голосов
/ 23 сентября 2010

Программа компилируется и запускается, как и ожидалось, правильно вызывая нужный оператор при попытке:

class A {
public:
    friend bool operator==(const A &a1, const A &a2);
};

bool operator==(const A &a1, const A &a2) {
    return false;
}

class B : public A {};
class C : public A {};

int main()
{
    B b;
    C c;
    bool equals = b == c;
    return 0;
}
1 голос
/ 24 сентября 2010

Как насчет:

class A
{
    public:
        bool operator==(A const& rhs) const
        {
            return this->isEqual(rhs);
        }
    private:
        virtual bool isEqual(A const& rhS)
        {
            return /* Your test here */
        }
};
class B: public A
{
    private:
        virtual bool isEqual(A const& rhS)
        {
            B& theRealRHS = dynamic_cast<B const&>(rhs);  // Throws if it is not a B
            return /* Your test here */
        }
};
1 голос
/ 23 сентября 2010

Мое предложение: не перегружайте операторы сравнения в базовых классах, а реализуйте эквивалентные защищенные методы.Это предотвратит некоторые трудно обнаруживаемые ошибки в вашей программе.

Пример:

class Base
{
  protected:
    bool equal_base(const Base& other) const
    { return member == other.member;}

  private:
    unsigned int member;
};

class B_Child : public Base
{
  public:
    bool operator==(const B_Child& other) const
    { return (member_b == other_member_b) && equal_base(other);}
  private:
    std::string member_b;
};

class C_Child : public Base
{
  public:
    bool operator==(const C_Child& other) const
    { return (member_c == other_member_c) && equal_base(other);}
  private:
    double member_c;
};

Также поищите в Интернете «оператор виртуального равенства C ++».

1 голос
/ 23 сентября 2010

Поместите оператора в класс.

#ifndef A_
#define A_

class A
{
    ...

public:

    bool operator==(const A &other)
    {
        // your operator logic
    }
}
#endif

При желании вы можете сделать его виртуальным, что позволит вам переопределить его в производных классах.

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