Friend函数无法访问C ++类的成员

时间:2017-04-12 15:32:52

标签: c++ class friend

我正在尝试将运算符“<<”重载为友元函数,但由于某种原因它无法访问该类的成员。为什么朋友功能不能访问 isEmpty()计数 call_DB [] ? 这是我写的代码:

#include <iostream>
#include <string>
using namespace std;
class callRecord
{
public:
   string firstname;
   string lastname;
   string cell_number;
   int relays;
   int call_length;
   double net_cost;
   double tax_rate;
   double call_tax;
   double total_cost;
};

class callClass
{
public:

   bool isEmpty();
   friend ostream & operator<<(ostream & out, callClass &Org);

private:
   int count;
   int size;
   callRecord *call_DB;
};

bool callClass::isEmpty()
{
   if (count == 0)
   {
       return 1;
   }
   else
   {
       return 0;
   }
}

ostream & operator<<(ostream & out, callClass &Org)
{
   if (isEmpty() == 1)
   {
       cout << "The array is empty" << endl;
   }
   else
   {
       out.setf(ios::showpoint);
       out.setf(ios::fixed);
       out.precision(2);

   for (int i = 0; i < count; i++)
       {
           out << setw(10) << call_DB[i].firstname << " ";
           out << setw(10) << call_DB[i].lastname << " ";
           out << call_DB[i].cell_number << "\t";
           out << call_DB[i].relays << "\t";
           out << call_DB[i].call_length << "\t";
           out << call_DB[i].net_cost << "\t";
           out << call_DB[i].tax_rate << "\t";
           out << call_DB[i].call_tax << "\t";
           out << call_DB[i].total_cost << endl;
       }
   }
}

感谢。

4 个答案:

答案 0 :(得分:2)

您的operator<<函数是全局函数,而不是callClass的成员。要访问这些字段,您需要使用Org.call_DBOrg.countOrg.isEmpty();

答案 1 :(得分:2)

因为你没有&#34;资格&#34;那些成员到一个实例。你需要写

ostream & operator<<(ostream & out, callClass &Org)
{
    if (Org.isEmpty() == 1)
//      ^^^^^

相似Org.countOrg.call_DB等。

请记住,您的operator<<全局功能,而不是成员功能。否则你首先不需要宣称它是朋友。

答案 2 :(得分:0)

  

为什么友方功能无法访问isEmpty(),count和call_DB []?

因为您不明白&#34;访问&#34;手段。这并不意味着友元函数成为类的方法,因此您不能在尝试时隐式使用this,您应该使用Org参数:

out << setw(10) << Org.call_DB[i].firstname << " "; 

其余部分相同。

答案 3 :(得分:0)

您的朋友功能不是会员功能,因此没有&#39;这个&#39;可用。您的操作员代码应如下所示:

ostream & operator<<(ostream & out, callClass &Org)
{
   for (int i = 0; i < count; i++)
       {
           out << Org.call_DB[i] << endl;
       }
   }
}

然后您还必须为<<提供运营商callRecord