Вставка перегрузки оператора - PullRequest
0 голосов
/ 14 декабря 2018

В чем проблема здесь.Он не работает должным образом.

Я хочу, чтобы << (вставка) работала как для cout, так и для cin. </strong>

#include<iostream>

using namespace std;

class a
{
private:
   string name;
   int age;
   unsigned long int salary; 
public:
   friend ostream& operator << (ostream& ,a );
   friend istream& operator << (istream& ,a );
};

ostream& operator << (ostream& dout,a a1){
   cout<<"Name = "<< a1.name<<"Age = "<<a1.age<<"Salary = "<<a1.salary<<end;
   return dout;
}
istream& operator << (istream& din,a& a1){
   cout<<"Enter Your Name , Age  , Salary .....Press Enter To Seperate New Value"<<end;
   cin>>a1.name>>a1.age>>a1.salary;
}
main(int argc, char const *argv[])
{
   a a1;

   cin<<a1;
   cout<<a1;
   return 0;
}

Ошибка слишкомдолго.-> Error ScreenShot

1 Ответ

0 голосов
/ 14 декабря 2018

Я не уверен, ПОЧЕМУ вы хотите это сделать, но это возможно.Просто помните, что просто потому, что вы можете что-то сделать, не означает, что вы ДОЛЖНЫ делать это (см. C ++ Faq Закон наименьшего сюрприза .
Помимо нарушения закона наименьшего удивления, вы можете делать то, что выпытаемся сделать, в вашем коде просто есть несколько простых ошибок компиляции, которые после исправления будут работать нормально (см. здесь для рабочего примера).

Вот изменения для его компиляции:

friend istream& operator << (istream& ,a& ); // Note the addition of the &

// Here the variabe is dout, so change to dout. I also added some spacing
ostream& operator << (ostream& dout,a a1){
   dout<<"Name = "<< a1.name<<" Age = "<<a1.age<<" Salary = "<<a1.salary<<endl;
   return dout;
}

// Here you are using din, so you need to change to din, also you had end instead of endl
istream& operator << (istream& din,a& a1){
    cout<<"Enter Your Name , Age  , Salary .....Press Enter To Seperate New Value"<<endl;
    din>>a1.name>>a1.age>>a1.salary;
    return din;
}

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

#include<iostream>

using namespace std;

class a
{
private:
   string name;
   int age;
   unsigned long int salary; 
public:
   friend ostream& operator << (ostream& ,a );
   friend istream& operator << (istream& ,a& );
};

ostream& operator << (ostream& dout,a a1){
   dout << "Name = "<< a1.name <<" Age = "<< a1.age <<" Salary = "<< a1.salary << endl;
   return dout;
}
istream& operator << (istream& din,a& a1){
   cout <<"Enter Your Name , Age  , Salary .....Press Enter To Seperate New Value" << endl;
   din >> a1.name >> a1.age >> a1.salary;
   return din;
}
main(int argc, char const *argv[])
{
   a a1;

   cin<<a1;
   cout<<a1;
   return 0;
}

Теперь, если мыЕсли вы хотите следовать закону наименьшего удивления, тогда мы изменим перегрузку оператора istream на использование >> вместо << и переместим текст консоли из перегрузки оператора >> и просто представим его пользователю передчтение значений.

#include<iostream>

using namespace std;

class a
{
private:
   string name;
   int age;
   unsigned long int salary; 
public:
   friend ostream& operator << (ostream& ,a );
   friend istream& operator >> (istream& ,a& );
};

// Note - Changed variable 'dout' to 'os' for clarity 
ostream& operator << (ostream& os, a a1){
   os << "Name = " << a1.name << " Age = " << a1.age << " Salary = "<< a1.salary << endl;
   return os;
}

// Changed variable from 'din' to 'is' for clarity
istream& operator >> (istream& is,a& a1){
   is >> a1.name >> a1.age >> a1.salary;
   return is;
}

main(int argc, char const *argv[])
{
   a a1;

   cout << "Enter Your Name , Age  , Salary .....Press Enter To Seperate New Value" << endl;    
   cin >> a1;
   cout << a1;
   return 0;
}
...