оператор перегрузки << для вывода членов объекта без использования функции Friend - PullRequest
4 голосов
/ 11 января 2012

Я обновляю cpp после длительного перерыва, пытаясь понять методы перегрузки операторов. Я пытался перегрузить «оператор <<» для вывода членов объекта. но я не могу сделать это без использования функции друга. Я ищу метод без использования функции друга. </p>

вот мой класс def:

class Add{
private:
int x;

public:
friend ostream& operator<<(ostream& ostr, Add const& rhs); //Method 1
void operator<<(ostream& ostr);                //Method 2
};

реализации функций

//Method 1
ostream& operator<<(ostream &ostr, Add const& rhs)
{
    ostr<<rhs.x;

return ostr;
}

//Method 2
void Add::operator<<(ostream& ostr)
{
    cout<<" using operator<< \n";
    ostr<<x;
}

вызовы из основной функции

cout<<Obj_Add;  //calls the Method 1

Obj_Add<<cout;  //calls the Method 2

Теперь мой вопрос: я хотел бы выполнить вызовы типа Метод 1 без использования функции друга. Но не знаю, можно или нет в cpp. Я пробовал несколько реализаций, но все это дает мне ошибки компиляции. Пожалуйста, помогите мне понять, что я здесь упускаю.

Ответы [ 4 ]

5 голосов
/ 11 января 2012

Если у вас есть общедоступные функции доступа в вашем классе или stream -подобные, вам не нужна дружба с operator<<:

// v1
class foo{
public:
  int data() const{ return _data; }
private:
  int _data;
};

std::ostream& operator<<(std::ostream& o, foo const& f){
  return o << f.data();
}

// v2
class foo{
public:
  void stream_to(std::ostream& o){
    o << _data;
  }
private:
  int _data;
};

std::ostream& operator<<(std::ostream& o, foo const& f){
  f.stream_to(o);
  return o;
}

v2 имеет дополнительное преимущество:stream_to - функция virtual, которая полезна для полиморфных базовых классов, поэтому вам не нужно переопределять operator<< для каждого производного класса, только stream_to.

2 голосов
/ 11 января 2012

Это возможно с геттером х.

если оператор << не является другом, он не может получить доступ к члену x </p>

class Add {
    private:
        int x;

    public:
        int getX() { return x; }
};

//Method 1
ostream& operator<<(ostream &ostr, Add const& rhs)
{
    //ostr<<rhs.x;       //Fail: x is private

    ostr << rhs.getX();  //Good

    return ostr;
}
1 голос
/ 11 января 2012

Вы можете не использовать оператор в качестве друга, если у вас есть другие способы получить x от объекта.

class Foo
{
private:
    int bar;

public:
    int get_bar() const { return bar; }
};

ostream &operator<<(ostream &os, const Foo &foo)
{
    os << foo.get_bar();
    return os;
}
0 голосов
/ 11 января 2012

Это невозможно, пока вы не добавите какой-либо механизм для вывода x, например, public

// in the class
int get_x() const { return x; }

или другой механизм для печати объекта

// outside the class
std::ostream &operator<<(std::ostream &out, Add const &obj)
{
    obj.print(out);
    return out;
}
...