WedX - журнал о программировании и компьютерных науках

Функция-член класса как друга другого класса

В этом коде я сделал максимальную функцию класса B другом класса A. Я также сделал предварительное объявление класса B. Но это дает ошибку.

#include<iostream>

using namespace std;

class B;

class A
{
   int a;
   public:

   void get()
   {
      cin>>a;
   }

   friend void B :: max(A , B);
};

class B
{
   int b;
   public:

   void get()
   {
      cin>>b;
   }

   void max(A x, B y)
   {
      if (x.a > y.b)
         cout<< " x is greater";
      else cout<<"y is greater";
   }
};

int main()
{
   A x;
   B y,c;
   x.get();
   y.get();
   c.max(x,y);
}

  • Всегда публикуйте любой текст ошибки в своем вопросе дословно. 23.08.2015
  • Вы видели этот вопрос в своем исследовании: Declare функция-член предварительно объявленного класса как друга 23.08.2015
  • Здесь вы можете получить несколько советов: other-class?rq=1">Как передать объявление функции-члена класса для использования в другом классе 23.08.2015

Ответы:


1

B является неполным в том месте, где вы объявляете B::max дружественным методом. Таким образом, компилятор не знает, существует ли такой метод.

Это означает, что вам необходимо

  1. переупорядочить классы, чтобы A знал, что B есть метод B::max и
  2. Реализуйте метод B::max вне определения класса, когда оба класса завершены, потому что вы получаете доступ к внутренним переменным.

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

Итак, имея это в виду:

class A;

class B{
    int b;
public: 
    void get(){
        cin>>b;
    }
    void max(const A& x, const B& y);
};

class A{
    int a;
public:
    void get(){
        cin>>a;
    }
    friend void B :: max(const A& , const B&);
};

void B::max(const A& x, const B& y) {
    if (x.a > y.b)
       cout<< " x is greater";
    else
        cout<<"y is greater";
}
23.08.2015
  • Подправил ответ, чтобы исправить себя, этот пункт был не нужен 23.08.2015

  • 2

    Как уже ответил R Sahu:

    Вы не можете использовать:

    friend void B :: max(A , B);
    

    без полного определения Б.

    Вот как вы можете достичь своей цели:

    #include<iostream>
    using namespace std;
    
    class A;
    
    class B{
        int b = 2;
    
    public: 
        void max(A x, B y);
    };
    
    class A{
        int a = 1;
    public:
        friend void B :: max(A , B);
    };
    
    void B::max(A x, B y){
        if (x.a > y.b)
            cout<< " x is greater";
        else 
            cout<<"y is greater";
    }
    
    int main(){
    A x;
    B y,c;
    c.max(x,y);
    }
    
    23.08.2015
  • как раз собирался ответить :) 23.08.2015

  • 3

    Вы не можете использовать:

    friend void B :: max(A , B);
    

    без полного определения B.

    Вам нужно будет переосмыслить свою стратегию, чтобы реализовать функциональность без использования объявления friend или переместить определение B перед определением A.

    23.08.2015
  • Пожалуйста, скажите мне, как я могу это сделать. 23.08.2015
  • Вы можете просто friend class B, если у вас нет проблем с дружбой со всем классом. 23.08.2015
  • могу ли я объявить void B:: max(A,B); после предварительного объявления класса B; 23.08.2015
  • @ishanbansal, нет, ты не можешь этого сделать. 23.08.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]