использование перегруженного << оператора в другом << перегрузка в другом классе

#c #operator-overloading #overloading #operator-keyword

#c #перегрузка оператора #перегрузка #оператор-ключевое слово

Вопрос:

Итак, вот в чем проблема. У меня есть класс B, где я перегрузил оператор <<, и класс A, где оператор << также перегружен. Однако << перегрузка в классе B, похоже, не работает в << перегрузка в классе A. Он просто возвращает адрес b, как если бы << перегрузки в классе B не существовало.

Любая помощь была бы очень признательна

 #pragma once
#include <ostream>

using namespace std;

class B {
public:

    B(int x) {
        this->x = x;
    }
    
    friend ostreamamp; operator<<(ostreamamp; os, Bamp; b)
    {
        os << "this is B " << b.x;
        return os; 
    }

private:
    int x;
};
 
 #pragma once
#include <ostream>
#include "B.h"

using namespace std;

class A {
public:

    A(B* b) {
        this->b = b;
        this->x = 0;
    }

    friend ostreamamp; operator<<(ostreamamp; os, Aamp; a)
    {
        os << a.b << endl; //this doesnt work <============
        os << "this is a " << a.x;
        return os;
    }

private:
    int x;
    B* b;
};
 
 #include <iostream>
#include "A.h"
#include "B.h"

using namespace std;

int main()
{
    B* b = new B(1);
    A* a = new A(b);
    cout << *a << "inside a "<< endl;
    cout << *b << "inside b " <<endl;
}

 

Ответ №1:

 os << a.b // ...
 

a.b это не a B , для которого вы определили перегрузку, посмотрите внимательнее на свой код:

 class A {
private:

    B* b;
};
 

Это а B * , а не а B , и для этого не существует перегрузки.

Если вы хотите вызвать перегрузку здесь, используйте os << (*a.b) // ... ;