Nano Hash - криптовалюты, майнинг, программирование

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

Как вы устанавливаете члены базового класса, используя реализацию оператора присваивания? Если, например, кто-то определяет оператор присваивания в производном классе следующим образом:

(где и colour, и Colour() являются членами базового класса, что означает, что строки, указанные ниже, недопустимы)

Derived& Derived::operator=(const Derived& rhs) 
{
if (&rhs != this)
{

    Colour(rhs.colour);    // not allowed
        Colour(rhs.Colour());  // not allowed
}
return *this;
}

Каково решение? Есть ли способ связать перегрузки операторов в базе? Делаю ли я что-то вроде...

Derived& Derived::operator=(const Derived& rhs) : Base::operator=(rhs)
...?

Ответы:


1

Вы близки, просто поместите этот вызов в тело метода.

 if (&rhs != this)
 {
    Base::operator=(rhs);
    // ...
08.12.2011

2

Это делается так:

class B
{
 public:
  B& operator=( const B & other )
  {
    v = other.v;
    return *this;
  }
  int v;
};

class D : public B
{
 public:
  D& operator=( const D & other )
  {
    B::operator=( other );
    return *this;
  }
};
08.12.2011

3

Я реализую функцию operator=, назначающую/создающую цвет в операторе базового класса, если вы хотите вызвать базовый оператор= из класса Derived:

Base::operator=(rhs)

в реализации оператора производного класса =(). Насколько я знаю, подпись, которую вы предложили для Derived operator=, недействительна для C++.

08.12.2011

4

Вы должны иметь возможность использовать общедоступные методы доступа и мутаторы:

Derived& Derived::operator=(const Derived& rhs) 
{
   if (&rhs != this)
      SetColour(rhs.GetColour());
   return *this;
}

В противном случае сделайте членов защищенными в базовом классе, чтобы производные классы имели доступ:

Derived& Derived::operator=(const Derived& rhs) 
{
   if (&rhs != this)
      colour = rhs.colour;
   return *this;
}

Третий вариант может состоять в том, чтобы определить оператор присваивания public в базовом классе и заставить ваш производный класс вызывать базовый оператор:

Derived& Derived::operator=(const Derived& rhs) 
{
   if (&rhs != this)
      Base::operator=(rhs);
   return *this;
}

Вот полный тестовый пример:

#define TEST 2
class Base
{
public:
    Base() : m_protected(0), m_private(0) {}
    Base(int pro, int pri) : m_protected(pro), m_private(pri) {}
    ~Base() {}

#if TEST == 1
    Base& operator=(const Base& rhs)
    {
        if (this != &rhs)
        {
            m_protected = rhs.m_protected;
            m_private = rhs.m_private;
        }

        return *this;
    }
#elif TEST == 2
    void SetPrivate(int i) { m_private = i; }
    int GetPrivate() const { return m_private; }
#endif

protected:
    int m_protected;
private:
    int m_private;
};

class Derived : public Base
{
public:
    Derived() : Base() {}
    Derived(int pro, int pri) : Base(pro, pri) {}
#if TEST == 1
    Derived& operator=(const Derived& rhs)
    {
        Base::operator=(rhs);
        return *this;
    }
#elif TEST == 2
    Derived& operator=(const Derived& rhs)
    {
        if (this != &rhs)
        {
            SetPrivate(rhs.GetPrivate());
            m_protected = rhs.m_protected;
        }
        return *this;
    }
#endif
};

int main()
{
    Derived a;
    Derived b(10, 5);

    a = b;
        return 0;
}
08.12.2011
  • уверены ли вы? мой компилятор не позволяет мне получить доступ к чему-либо из базового класса, общедоступного или иного. 08.12.2011
  • он говорит, что ни один экземпляр перегруженного аргумента не соответствует (что неверно), а также говорит, что объект имеет квалификаторы типа, которые предотвращают совпадение. Что это обозначает? 08.12.2011
  • Все это работает, если вы используете открытое наследование и неконстантные методы. Можете ли вы показать больше определений и использования ваших классов? 08.12.2011
  • Это действительно очень стандартно, все общедоступно и неконстантно. 08.12.2011
  • Я обновил автономный тестовый пример, который позволяет вам опробовать все три варианта, о которых я упоминал ранее. 08.12.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..