繁体   English   中英

朋友ostream&运营商<<无法访问私人会员

[英]Friend ostream& operator<< can't access private member

大致来说,这就是我的代码:

template<typename K, typename V>
class A{
 private:
   size_t num_;
 public:
   A(initializer_list< something<K,V> > smthng);
   friend ostream& operator<<(ostream &out, const A &as){
       size_t number = num_;
  };  
};

template<typename K, typename V>
A<K,V>::A(initializer_list< something<K,V> > smthng){

    size_t sz = 5;
    num_ = sz;
}

由于某种原因,当我尝试编译时,我的代码将始终将“错误:无效使用非静态数据成员”作为错误。 显然,上面的代码不是我确切拥有的,但这是我遇到的唯一错误。 我以为使用好友功能的好处是可以访问私有成员,但我似乎做不到。

朋友函数是使用您要在其中定义类的外部函数。您可以访问私有成员,但没有this指针可用。

因此,您应该更改

size_t number = num_; 

size_t number = as.num_;

operator<<()实现中。

就目前而言,您正在使用num_变量,就好像它是一个静态成员变量一样,也就是说,好像它不属于某个类的特定对象而是属于整个类。 您需要做的是指示需要通过<<操作符访问其私有成员变量num_的对象。 您需要做:

class A{

private:
    int num_;

public:
    A();

friend std::ostream& operator<<(std::ostream &out, const A &as)
{
   int number = as.num_;
   out << number << std::endl;
}  
};

A::A()
{

   int sz = 5;
   num_ = sz;
}

int main()
{
   A object;
   std::cout << object << std::endl;

   return 0;
}  

这对我来说很好。 尝试按原样进行编译,您会在控制台上看到无错误显示5。 分段错误可能是由于代码上的另一个错误。

我对运算符有同样的问题,它没有访问该类的私有成员。

class X {
    char* xName;
    double dd;
public:
    X(char*, double);
    X(const X&);
    ~X();
    X& operator=(const X&);
    friend ostream& operator<<(ostream&, X&);
};

//in cpp

ostream& operator<<(ostream& o, X& obj) {

    /*when i try the following i have error msg saying that private member xName is
   inaccessible*/
  o>> obj.xName >> endl;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM