0

第一类:

class Class1{
public:
    Class1(Class2 * a, int b );
    ~Class1();
    friend ostream& operator<< (ostream& x, const Class1& c1);

private:
    int b;
    Class2 * a;
};

ostream& operator<< (ostream& x, const Class1& c1)
{
    stream<<"("<<c1.a->label<<","<<c1.b<<")"<<endl;
    return x;
}

Class2(在另一个文件中):

class Class2
{
public : 
   Class2 (string label);
   ~Class2();
  string getLabel()
  {
     return label; 
  }

private:
    string label;
    vector<Class1 *> c1vector;
};

问题:

我正在尝试打印边缘的标签和 b,但它说标签是私有的。你能告诉我我做错了什么吗?谢谢。

4

4 回答 4

1

你必须写在 Class2 friend ostream& operator<< (ostream& x, const Class1& c1);,因为只有 Class 1 是它的朋友,但如果是 class2 的私有属性,则标记

于 2013-05-16T13:59:51.693 回答
1

label在内部是私有的,Class2因此无法通过Class您的operator<<插入功能访问。最简单的解决方案是提供一个公共 constget_label函数Class2来访问标签字符串。

更深入的方法是提供Class2自己的打印机制(通过打印/显示/显示功能,或者通过自己的operator<<可用于显示标签的功能。

于 2013-05-16T13:59:56.297 回答
1

一个问题是:label在 中是私有的Class2,您Class1不能通过 的实例直接在内部访问它Class2a在这种情况下就是这样。您可能需要在getters里面提供Class2.

 class Class2
 {
  public : 
      string getLable()
      {
         return label; 
      }
  private:
     string label;
};//^^other members skipped for clearance purpose
于 2013-05-16T14:00:07.913 回答
1

好吧,您正试图直接访问 Class2 的私有成员,而私有属性实际上是阻止您这样做的原因。(事实上​​,您operator<<在 Class1 中的合格朋友并没有改变任何事情,label是 Class2 的私人成员)。

要么公开成员(不推荐),要么提供返回此成员值的公共成员函数。

于 2013-05-16T14:00:13.537 回答